java泛型通配符的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java泛型通配符的问题相关的知识,希望对你有一定的参考价值。

为什么B的子类C可以放进去,父类A却不行?
<? super B>是说B或B的父类?

首先<? super B>表示的是B或者B的父类。
你的List<? super B> list = new ArrayList<>();这句赋值出现了警告是因为你将一个原生的ArraylList引用传递给有限制的List,改成这样List<? super B> list = new ArrayList<A>();警告就消失了
那么为什么不能在其中放入A的实例呢,因为你将ArrayList<A>转型为ArrayList<? super B>,编译器会认为这个list中存放的是某一个B类的父类的实例,但不能确定是A,所以你传入A会出错,但是你传入B或C的实例呢,起码可以保证它是一个B,那就肯定没错了。
参考技术A 首先<? super B>表示的是B或者B的父类。
你的List<? super B> list = new ArrayList<>();这句赋值出现了警告是因为你将一个原生的ArraylList引用传递给有限制的List,改成这样List<? super B> list = new ArrayList<A>();警告就消失了
那么为什么不能在其中放入A的实例呢,因为你将ArrayList<A>转型为ArrayList<? super B>,编译器会认为这个list中存放的是某一个B类的父类的实例,但不能确定是A,所以你传入A会出错,但是你传入B或C的实例呢,起码可以保证它是一个B,那就肯定没错了。
参考技术B <? super B>是通配B自己以及父类为B的类,所以B的父类不行
你用<? super A>就3个都可以了可以追问

就是说,表示B的实例或者其子类的实例?

追答

是的

参考技术C 同问 我也不是很懂

以上是关于java泛型通配符的问题的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型中T和问号(通配符)的区别

java泛型与通配符

Java泛型学习笔记 - 浅析泛型中通配符的使用

Java里的泛型加通配符的用法

Java Review(三十泛型)

深入理解Java泛型协变逆变泛型通配符自限定