面试总结之泛型基础知识

来源:互联网 发布:2016年网络炒作事件 编辑:程序博客网 时间:2024/06/05 13:57

一、泛型概念

参数化类型,即将类型由原来的具体的类型参数化。
泛型类型在逻辑上看,可以看成是多个不同的类型,实际上都是相同的类型。如List和List实际上都是List类型

二、类型通配符

类型通配符一般是使用 ? 代替具体的类型实参。(注意是实参!不是形参)
List<?>在逻辑上可指代所有的List<具体类型实参>,比如:List<String>List<Integer>
类型通配符上限:List<? extends Number>//传递的参数只能是Number或者子类
类型通配符下限:List<? super Number>//传递的参数只能是Number或者父类

三、泛型的擦除机制

泛型作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出。比如说:成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。
(补充:由于JVM泛型的擦除机制,在运行时JVM是不知道泛型信息的。比如说,可以给array[1]赋上一个ArrayList而不会出现异常,但是在取出数据的时候却要做一次类型转换,所以就会出现ClassCastException,如果可以进行泛型数组的声明,上面说的这种情况在编译期将不会出现任何的警告和错误,只有在运行时才会出错。)

四、泛型的好处

1、类型安全。

通过知道使用泛型定义的变量的类型限制,编译器可以更有效地提高Java程序的类型安全。

2、消除强制类型转换。

消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。所有的强制转换都是自动和隐式的,提高代码的重用率。

五、泛型使用的注意事项

(1)泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
(2)泛型的类型参数可以有多个。
(3)不能对确切的泛型类型使用instanceof操作。
(4)不能创建一个确切的泛型类型的数组。
补充:使用泛型后,容器中能存储的对象的类型就已经确定了,如果你将其他类型的对象放入容器会在编译器报错,而取对象时编译器也会帮你转型,这可以减少我们编程时犯错率,但并不能提升运行时的性能。 最多影响一下编译速度,由于泛型擦除机制的存在,不会影响运行时间。

参考文章:http://www.cnblogs.com/lwbqqyumidi/p/3837629.html