1. 使用场景:一般是集合用的较多。
2. 使用规则:
- public static <E> void printArr(E [] inputArray)
- 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前
- 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符
- 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符
- 泛型方法方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)
3. 泛型相关面试题:
1.java中的泛型是什么?好处是?
定义:泛型是一种参数化类型的机制。它可以使得代码适用于各种类型,从而编写更加通用的代码,例如集合框架
优点:是一种编译时类型确认机制,提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。
2.如何工作?什么是类型擦除?
原理:依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。
擦除:编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息
3.什么是泛型中的限定通配符和非限定通配符
限定通配符对类型进行了限制,有两种限定通配符,一种是<? extends T>它通过确保类型必须是T的子类来设定类型的上界,另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界
泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误
<?>表示了非限定通配符,因为<?>可以用任意类型来替代
4.如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型
要用泛型类型来替代原始类型,比如使用T, E or K,V等被广泛认可的类型占位符
5.你可以把List<String>传递给一个接受List<Object>参数的方法吗?
会导致编译错误,因为List<Object>可以存储任何类型的对象包括String, Integer等等,而List<String>却只能用来存储Strings
6.Array中可以用泛型吗?
Array不支持泛型,建议用List代替Array,因为List可以提供编译期的类型安全保证
7.如何阻止Java中的类型未检查的警告?
这种警告可以使用@SuppressWarnings("unchecked")注解来屏蔽
8.Java中List<Object>和原始类型List之间的区别?
在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查,
你可以把任何带参数的泛型类型传递给接受原始类型List的方法
9.Java中List<?>和List<Object>之间的区别是什么?
List<?> 是一个未知类型的List,而List<Object>其实是任意类型的List
你可以把List<String>, List<Integer>赋值给List<?>,却不能把List<String>赋值给List<Object>
10.List<String>和原始类型List之间的区别
带参数类型是类型安全的,而且其类型安全是由编译器保证的,但原始类型List却不是类型安全的
你不能把String之外的任何其它类型的Object存入String类型的List中,而你可以把任何类型的对象存入原始List中
使用泛型的带参数类型你不需要进行类型转换,但是对于原始类型,你则需要进行显式的类型转换
11.无界通配符
List<?> ?可以是任意类型,也就是未知类型
List<Object>与List<?>并不等同,List<Object>是List<?>的子类