Java泛型-Android面试准备2019-1-23

接口

接口到底是干什么的?答:接口是用来指明相关或者不相关类的多个对象的共同行为(共同方法)。例如,使用正确的接口,可以指明这些对象是可比较的、可食用的、以及可克隆的等等。

泛型

泛型使我们可以定义带泛型类型的类或接口或方法,随后编译器会用具体的类型来替换它。

优点:能够在编译时而不是在运行时检测出错误,因此可以提高软件的可靠性和可读性。其实很好理解,我们自定义一个整型栈类,栈类里面是一个ArrayList,如果ArrayList里面元素类型使用Object,此时无论是Integer类还是String类的实例都可以放进去,但是应该放进去Integer类实例,如果传错了(譬如传了一个String类实例)将不会报错,但使用了泛型的话,在编译时就会报错。

注意:泛型类型必须是引用类型,不能使用基本数据类型(int,double,char)来替换泛型类型,但可以使用Integer,这时可以传入一个int,Java会将其包装为Integer,这个过程称作自动打包。同样,如果元素是包装类型(Integer,Double,Character),那么可以直接将这个元素赋给一个基本类型的变量,这个过程称为自动拆箱。

定义泛型类:

为了定义一个类为泛型类型,需要将泛型类型放在类名之后,例如StringStack<E>。

注意:为了创建一个字符串堆栈,可以使用new StringStack<String>(),但需要注意定义这个类的构造方法时不写泛型标识,应该被定义为public StringStack() {},即不进行显式定义,使用Java默认提供的无参构造方法即可。

定义泛型方法:

为了定义一个方法为泛型类型,要将泛型类型放在方法返回类型之前,例如<E> void printMax(E o1, E o2)。

可以为静态方法定义泛型类型。

泛型方法的定义与调用
受限的泛型类型

通配泛型:

1.为什么需要通配泛型?

首先,Integer是Number的子类。我们现在定义了一个方法用来找到栈中的最大值,签名是public static double max(GenericStack<Number> stack),如果这时有一个类型为GenericStack<Integer>的栈实例integerStack,语句int a = max(integerStack)会报错,因为integerStack不是GenericStack<Number>的实例。尽管Integer是Number的子类型,但是GenericStack<Integer>并不是GenericStack<Number>的子类型,这时我们需要通配泛型类型。

2.通配泛型类型

通配泛型类型有三种:?(非受限通配符)、? Extends T()或者? super T。

?称为非受限通配,它和? extends Object是一样的。? Extends T()称为受限通配,表示T或T的一个子类型。? super T称为下限通配,表示T或T的一个父类型。

将上面的函数签名改为public static double max(GenericStack<? Extends Number> stack)即可,<? Extends Number>是一个表示Number或Number子类型的通配类型。

消除泛型:

编译器可使用泛型信息,但这些信息在运行时是不可用的,这被称为类型消除。编译器使用泛型类型信息来编译代码,但是随后会消除它,即泛型信息在运行时是不可用的。泛型存在于编译时,一旦编译器确认泛型类型是安全使用的,就会将它转换为原始类型。

例子:

将a编译成b

如果一个泛型类型是受限的,那么编译器就会用该受限类型来替换它。

例子:

将a编译成b

非常需要注意的是,不管实际的具体类型是什么,泛型类是被它的所有实例所共享的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 转载自这里,这哥们也是转载但是没注明....所以找不到原作者 1. 概述 泛型在java中有很重要的地位,在面向对...
    琴匣自鸣阅读 1,251评论 0 14
  • 参考地址:《Java 泛型,你了解类型擦除吗?》 《Java中的逆变与协变》 《java 泛型中 T、E .....
    琦小虾阅读 2,967评论 0 10
  • 开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List作为形式参数,那么如果尝试...
    时待吾阅读 1,040评论 0 3
  • Java 泛型是 Java 5 引入的一个重要特性,相信大多数 Java 开发者都对此不陌生,但是泛型背后的实现原...
    JohnnyShieh阅读 2,056评论 6 37
  • 泛型 泛型(Generic Type)简介 通常情况的类和函数,我们只需要使用具体的类型即可:要么是基本类型,要么...
    Tenderness4阅读 1,412评论 4 2