文章目录
Java中的泛型是什么 ? 使用泛型的好处是什么?
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
好处:
- 类型安全,提供编译期键的类型检测
- 前后兼顾
- 泛化代码,代码可以更多的重复利用
- 性能较高,用java泛型编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件
Java的泛型是如何工作的 ? 什么是类型擦除 ?如何工作?
- 类型检查:在生成字节码之前提供类型检查
- 类型擦除:所有类型参数都用它们的限定类型替换,包括类,变量,方法(类型擦除)
- 如果类型擦除和多态性发生了冲突时,则在子类中生成桥方法解决
- 如果调用泛型方法的返回类型被擦除,则在调用该方法时插入强制类型转换
类型擦除:
所有类型参数都用他们的限定类型替换:
比如T -> Object ? extends BaseClass ->BaseClass
如何工作:
泛型是通过类型擦除来是实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息,例如List在运行时仅用一个List来表示。这样做的目的,是确保能和Java5之前的版本开发二进制类库进行兼容,你无法在运行时访问到类型参数,因为编译器已经把泛型转换成了原始类型。
可以把List传递给一个接受List< Object >参数的方法吗?
对任何一个不太熟悉泛型的人来说,这个java泛型题目看起来令人疑惑,因为咋看起来String是一种Object,所以List< String >应当可以用在需要List< Object >的地方,但是事实并非如此,如果这样做的话会导致编译错误,如果再深一步考虑,你会发现这样做是有意义的,因为List< Object >可以存储任何类型的对象包括String,Integer等等,而List< String >却只能用来存储String s
List< Object > objectList
List < String > stringList
objectList = stringList; //compilation error incompatible types
如何阻止Java中的类型未检查的警告?
如果你把泛型和原始类型混合起来使用,例如下列代码,java 5的javac编译器会产生类型未检查的警告,例如
List rawList = newArrayList()
注意: Hello.java使用了未检查或称为不安全的操作;
这种警告可以使用@SuppressWarnings(“unchecked”)注解来屏蔽。
Java中List和原始类型List之间的区别?
原始类型和带参数类型< Object >之间的主要区别:在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查,通过使用Object作为类型,可以告知编译器该方法可以接受任何类型的对象,比如String或Integer
这道题主要考察点在于对泛型中原始类型的正确理解,他们之间的第二点区别是,你可以把任何带参数的类型传递原始类型List,但却不能把List< String >传递给接受List< Object >方法,因为会产生编译错误
Array中可以用泛型吗?
这可能是java泛型面试中最简单的一个了,当然前提是你要直到Array事实上并不支持泛型,这也是为什么Joshua Bloch在Effective java一书中建议使用List来代替Array,因为List可以提供编译期的类型安全保证,而Array却不能
如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?
编写泛型方法并不困难,你需要用泛型类型来替代原始类型,比如使用T, E or K,V等被广泛认可的类型占位符。最简单的情况下,一个泛型方法可能会像这样:
public V put(K key, V value) {
return cahe.put(key,value);
}
3060

被折叠的 条评论
为什么被折叠?



