Java泛型我真的悟了

Java泛型我真的悟了,第1张

说起这个泛型在刚开始学习的时候就很模糊,对于这东西看着就怕。今天花了很久的时间琢磨,先贴上一个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. 取获得的是最大范围,但是可以强转.

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/869199.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存