说起这个泛型在刚开始学习的时候就很模糊,对于这东西看着就怕。今天花了很久的时间琢磨,先贴上一个b站up讲解的链接 Java泛型链接 讲的非常好。

通配符 ?

? 并不等同于Object 而是代表无穷的意思

如下写法是报错的,原因是 ?是大于Object类型的。 (大范围的对象约束的泛型方法,是能往里面放任何类型的子类对象,如果如下能成立必然在编译器报错。) add方法是被泛型约束的方法,不是泛型方法

在这里插入图片描述

协变 ? extends XX

协变代表:将被匹配的值转为 XX的子类,只有 XX的子类才可以匹配

  1. 为什么要使用 extends ?
    使用协变可以约束传入值的范围,确定边界。试想如果都是 ?是不是范围很大。
    使用协变的时候不能使用 XX类型里面带有泛型参数方法进行的

    在这里插入图片描述
    为什么会出现这种情况,这个时候安静想一想 ? extends Number ,就是将接收的Integer变为
    Number因为泛型边界问题 (? extends Nmber 代表 ? <=Number 取最小值 就是Number),当使用
    Number 作为对象去调用的时候,里面的add方法必然可以传入Number的所有子类”float,Integer”,
    如果不加以约束,那岂不是右边的Integer里面的值都改变了.

逆变 ? super XX

逆变代表: 将?的值转为XX的父类

  1. 为什么使用 super ,可以使得接入的参数类型为XX的父类
    当取出来的时候为最大范围Object(本来应该是? 但是没用?这个类型,就使用Object)
    往里面add数据必须是最小范围(如果不是最小范围的数据,会导致左边的接收里面出现类型混杂)
    在这里插入图片描述

总结

  1. 存只能存最小范围,要保证数据一致.
  2. 取获得的是最大范围,但是可以强转.

版权声明:本文为weixin_46351306原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_46351306/article/details/124547303