Java17 泛型

JDK5中支持. 泛型只支持引用数据类型.为什么?请看下面:

cfe2dc5a078d3805aebee252a5f393e6_MD5 所有的数据被存的时候都是以Object存储. cb324a901af3ba7c6949652de0756f6d_MD5

Java的泛型是伪泛型.它只是帮助编译器做类型检查. 刚才如果我们用ArrayList<String> list = new ArrayList<>();,然后往其中add 字符串,但实际上存储的仍然是Object.只是我们取出当中的元素的时候,会自动帮我们强转成String.(可见后面是怎么"自动"的)

如果我们查看class文件,会发现全部都是ArrayList list = new ArrayList(); 也就是说,底层不是真正的泛型,只是泛型帮助编译器做检查而已. 泛型会在编译过后,在class文件当中消失.这叫做"泛型擦除"

为什么?因为JDK5以前是没有泛型的.如果不采用泛型擦除,那么JDK5以前的老代码就不能和之后的代码兼容了.


按照上面的逻辑,我们ArrayList list = new ArrayList<>(); 然后list中add子类对象也是可以的.


泛型类 16478c80cadf960706bf5886fff096ed_MD5 E:element T:type 98301a71eecaafce29c706ca3a2e201a_MD5

使用: aae572cfe321b23ca4ceac48e3ad0da2_MD5


泛型方法 db84b1aeeabbe0e0393ee9ffcc546bf0_MD5 4f7d63d24c4de9a62a83d9a702ca24d0_MD5

可变参数:底层就是一个普通数组.写法就是三个点 4ae3a603c7a33f6a924fbcc22d63ee71_MD5

泛型接口: 411fafe3545db733af1c1f296e7c9704_MD5 1.实现类自己给出类型:(注:List<T>是个泛型接口)

c871646c90fa3bd15fda103c2ac08586_MD5 之后,使用MyArrayList2就像使用普通类一样,不需要再指定泛型什么的了. 2.类泛型延续 d4582dbbdbb0c322d3c02d092c237a97_MD5


泛型不具备继承性.也就是说,下面这样写会报错: 7ae770abd0bbe4605aa5652a57e9fc64_MD5 注意,这和ArrayList可以存子类是不一样的.这是因为"数据具备继承性" 那我上面的需要怎么办?写成public static<E> void method(ArrayList<E> list)即可.


泛型通配符:如果不确定类型,但是知道是在某个继承体系中的,则可以使用 36687ee050d7efdbd4593bbf61545846_MD5 注意,这里不需要像泛型函数一样在static后写<E>