Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?
什么是泛型?
Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检查机制,该机制允许程序员在编译时监测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
List<Integer> list = new ArrayList<>();
list.add(12);
//这里直接添加会报错·
list.add("a");
Class<? extends List> clazz =list.getClass();
Method add = clazz.getDeclaredMethod("add",Object.class);
//但是通过反射添加是可以的
add.invoke(list,"k1");
System.out.println(list);
泛型一般有三种使用方式:泛型类,泛型接口,泛型方法
泛型类:
//此处T可以随便写为任意标识,常见的如T,E,K,V等形式的参数常用与表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
private T key;
public Generic(T key){
this.key = key;
}
publicT getkey(){
return key;
}
}
如何实例化泛型类:
Generic<Integer> genericInteger = new Genrice<Integer> (123456);
2.泛型接口
public interface Generator<T>{
public T method();
}
实现泛型接口,指定类型:
class GeneratorImpl<T> implements Generator<String>{
@Override
public string method(){
return "hello";
}
}
泛型方法
public static <E> void printArray( E[] inputArray)
{
for (E element :inputArray){
System.out.printf("%s",element);
}
System.out.println();
}
使用:
//创建不同类型数组:Integer,Double和Character
Integer[] intArray = {1,2,3}';
String[] stringArray = {"Hello","World”};
printArray(intArray);
printArray(stringArray);
泛型常用的通配符有那些?
常用的通配符为T,E,K,V,?
?表示不确定的java类型
T(type)表示具体的一个java类型
K V(key value)分别代表java键值中的Key Value
E(element)代表Element
什么是泛型擦除?
所谓的泛型擦除,官方名叫“类型擦除”
Java的泛型是伪泛型,这是因为Java在编译期间,所有的类型信息都会被擦除。
也就是说,在运行的时候是没有泛型的。
例如这段代码,往一群猫里放条狗:
LinkedList<Cat> cats = new LinkedList<Cat>();
LinkedList List = cats; //注意我再这里把泛型去掉了,但是list和cats是同一个链表?
list.add(new Dog()); //完全没问题!
因为Java的泛型只存在于源码里,编译的时候给你静态地检查一下泛型类型是否正确,而到了运行时就不检查了。
上面这段代码在JRE(Java运行环境)看;来和下面这段没区别:
LinkedList cats = new LinkedList(); //注意:没有泛型!
LinkedList list = cats;
list.add(new Dog());
为什么要类型擦除呢?
主要是为了向下兼容,因为JDK5之前是没有泛型的,为了让JVM保持向下兼容,就出现了类型擦除这个策略。