定义:
JDK5引入的一种参数化类型特性
static class A{}
static interface B{}
static interface C{}
//类必须在接口的前面
static class D<T extends A & B & C>{}
泛型擦除:
比如没有ArrayList<int>,只有ArrayList<Integer>,当泛型擦除后,ArrayList的原始类中的类型变量T替换成了Object,但Object不能存放基本数据类型
因为泛型擦除后,ArrayList<String>只剩下原始类型,泛型信息String不存在了
@Override
public boolean equals(Object o) {
super.equals(o);
}
@Override
public boolean equals(T o) {
super.equals(o);
}
public static <E> void append(List<E> list){
//编译会报错
E element = new E();
list.add(element);
}
不过可以通过反射来创建
public static <E> void append(List<E> list, Class<E> cls) throws Exception {
E element = cls.newInstance();
list.add(element);
}
通配符让泛型转型更灵活
限定通配符
<? extends Fruit>是上届通配符,相当于“只读”
Plate<? extends Fruit> fruitPlate = plate(Plate<Apple> 类型)
//下面会报错,因为具体类型丢失了,只能是Fruit
fruitPlate.set(new Apple())
解决方案:可以用反射来set,但是安全性降低
Method set = friutPlate.getClass().getMethod("set", Object.class);
set.invoke(fruitPlate, new Banana())
//什么都能set,安全性降低
set.invoke(fruitPlate, new Beef())
1、Java泛型原理?什么是泛型擦除机制?
Java泛型是JDK5新引入的特性,为了向下兼容,虚拟机其实不支持泛型,所以Java实现的是伪泛型机制,也就是说Java在编译期擦除了所有的泛型信息,这样Java就不需要产生新的类型到字节码,所有的泛型类型最终都是一种原始类型,在Java运行时根本就不存在泛型信息
2、Java编译器具体是如何擦除泛型的
Kotlin的泛型可以看文章:Android面试题之Kotlin泛型和reified关键字
END
点亮【赞和在看】,让钱和爱都流向你。
心里种花,人生才不会荒芜,如果你也想一起成长,请点个关注吧。
作者介绍
中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机
越努力越幸运,加油💪,一起遇见更好的自己