Java通配符(?):未知类型的使用以及泛型的类型擦除和泛型的的限制

1.功能:
(1)用于参数,字段或局部变量的定义类型
(2)也可以作为返回类型

2.注意点:通配符不用于泛型方法调用,泛型实例创建以及超类型的类型参数

3.三类通配符
(1)上限有界通配符
如:List<? extends Number >list
(2)下限无界通配符
如:List <? super Integer >list
(3)无界通配符
如:List <?>list:
注:基于泛型类中不依赖于类型参数的方法,只能在这种情况下插入null
如:List list
注:基于Object类或子类提供的的方法

4.基于通配符建立泛型类或接口间关系
如:基于List不是List 子类型
List <? extends Integer >intList =new ArrayList <>();
List <? extends Number > numList =intList;

5.基于泛型的类型擦除
适用于无界参数类型,采用泛型或对象替换泛型类型中所有参数类型,生成的字节码仅包含普通类;
适用于插入类型铸件可以保持类型安全;
适用于可以生成桥接方法保留扩展泛型类型的多态性。
(1)擦除泛型类型:
Java编辑器对所有类型参数进行擦除,
其中对于有界类型参数进行替换并绑定为第一个类,
其中无界类型参数替换为Object
(2)擦除泛型方法:
替换同擦除泛型类型

6.泛型的限制:
(1)无法使用基本类型实例化泛型
(2)无法创建类型参数的实例
如:T t =new T();
但可义基于反射创建类型参数
Class cls
E t=cls.newInstance ();
(3)无法声明类型为类型参数的静态字段:
基于类的静态字段是类的所有非静态对象共享的类级变量,容易混淆共享的静态字段
如:static T os
(4)无法使用具有参数化类型的强制转换和instanceof:
理由:基于擦除泛型类型,运行时无法验证,
若使用无界通配符,则可以验证为哪一种集合
注意点:在某些情况下,编辑器知道类型参数始终有效,且允许强制转换
如:List li =…;
ArrayList l2=(ArrayList ) li;
(5)无法创建参数化类型数组:
理由:无法抛出所需ArrayStoreException
(6)无法创建、捕获、抛出参数化类型对象
理由:泛型类不能直接或间接扩展Throwable类
(7)擦除到原生类型的方法无法重载:
理由:类型擦除后具有相同签名

猜你喜欢

转载自blog.csdn.net/m0_59416550/article/details/127163744