本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
定义:JDK5引入的一种参数化类型特性
继承和实现接口可以多个
static class A{
}
static interface B{
}
static interface C{
}
//类必须在接口的前面
static class D<T extends A & B & C>{
}
泛型原理
泛型擦除:
- 做类型检查,T如果有做类型限制,会转化为第1种限制,否则会擦除为object
- 生成桥方法,里面调用对应的接口方法,调用的时候会进行类型的强转,转为T的限制类型
- 泛型擦除后,字节码中没有泛型信息了,但是类的常量池里保留了泛型信息。反射的时候提供了一套API可以拿到,比如getGenericType()
泛型带来的问题
- 泛型类型变量不能使用基本类型
比如没有ArrayList<int>,只有ArrayList<Integer>,
当泛型擦除后,ArrayList的原始类中的类型变量T替换成了Object,但Object不能存放基本数据类型
- 不能使用instanceof运算符
因为泛型擦除后,ArrayList<String>只剩下原始类型,泛型信息String不存在了
-
泛型在静态方法和静态类中的问题
因为泛型类中的泛型参数的实例化是在定义泛型类型对象时候指定的,而静态成员是不需要使用对象来调用的,所有对象都没