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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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