我对泛型通配符概念毫不怀疑。
1.假设我有一个方法:void write(List<?> list)我用调用它List<Dog> list,write(list)并尝试在write()中添加list.add(new Dog())一个编译错误,为什么?
void write(List<?> list)
List<Dog> list
write(list)
list.add(new Dog())
我的理解是指未知类型并且可以接受任何类型,因此,如果我使用Dog类型调用它,则应该允许将Dog添加到列表中…我在这里推断出什么错误?
2.现在,如果我使用有界通配符,write(List<? super Dog>list>它可以解决上述问题,为什么?并且这允许我将Dog添加到列表中但是,根据对?super Dog …的理解,它应该允许Dog和Dog的super ....所以我应该也可以将Animal添加到列表中?但是出现编译错误。
write(List<? super Dog>list>
我认为这个问题是因为write(List<? super Dog>list>仅允许我使用Dog的列表或super的列表来调用write(),并且一旦使用类型调用了它……您只能添加到仅该类型的列表中,对吗?
提前致谢..
假设我有一个方法:void write(List list),我用List list调用它,write(list)并尝试像list.add(new Dog())一样添加write(),这是编译错误,为什么?
?是泛型中的通配符运算符,现在的含义是您 不完全知道 自己List要获得哪种类型。所以你怎么可以肯定的是它可以是一个List的Dog秒。如果它是a,List<Cat>那么您的write方法将在其中添加一个Dog。因此Java限制您这样做。
?
List
Dog
List<Cat>
write
现在,如果我使用有界通配符,则write(List list>可以解决上述问题,为什么?
? super Dog代表Dog的任何超类,包括其自身。因此,当您进入时List<? superDog>,write您将知道List是其中一个的列表List<Object>orList<Dog>。在这两种情况下,将新添加Dog到列表都是安全的。
? super Dog
List<? superDog>
List<Object>orList<Dog>