说起这个泛型在刚开始学习的时候就很模糊,对于这东西看着就怕。今天花了很久的时间琢磨,先贴上一个b站up讲解的链接 Java泛型链接 讲的非常好。
通配符 ?
? 并不等同于Object 而是代表无穷的意思
如下写法是报错的,原因是 ?是大于Object类型的。 (大范围的对象约束的泛型方法,是能往里面放任何类型的子类对象,如果如下能成立必然在编译器报错。) add方法是被泛型约束的方法,不是泛型方法
协变 ? extends XX
协变代表:将被匹配的值转为 XX的子类,只有 XX的子类才可以匹配
-
为什么要使用 extends ?
使用协变可以约束传入值的范围,确定边界。试想如果都是 ?是不是范围很大。
使用协变的时候不能使用 XX类型里面带有泛型参数方法进行的。
为什么会出现这种情况,这个时候安静想一想 ? extends Number ,就是将接收的Integer变为
Number因为泛型边界问题 (? extends Nmber 代表 ? <=Number 取最小值 就是Number),当使用
Number 作为对象去调用的时候,里面的add方法必然可以传入Number的所有子类”float,Integer”,
如果不加以约束,那岂不是右边的Integer里面的值都改变了.
逆变 ? super XX
逆变代表: 将?的值转为XX的父类
- 为什么使用 super ,可以使得接入的参数类型为XX的父类
当取出来的时候为最大范围Object(本来应该是? 但是没用?这个类型,就使用Object)
往里面add数据必须是最小范围(如果不是最小范围的数据,会导致左边的接收里面出现类型混杂)
总结
- 存只能存最小范围,要保证数据一致.
- 取获得的是最大范围,但是可以强转.
版权声明:本文为weixin_46351306原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。