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)擦除到原生类型的方法无法重载:
理由:类型擦除后具有相同签名

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅花与竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值