小编典典

为什么通过方法将元素(正确类型)添加到列表中是编译错误?

java

我对泛型通配符概念毫不怀疑。

1.假设我有一个方法:void write(List<?> list)我用调用它List<Dog> listwrite(list)并尝试在write()中添加list.add(new Dog())一个编译错误,为什么?

我的理解是指未知类型并且可以接受任何类型,因此,如果我使用Dog类型调用它,则应该允许将Dog添加到列表中…我在这里推断出什么错误?

2.现在,如果我使用有界通配符,write(List<? super Dog>list>它可以解决上述问题,为什么?并且这允许我将Dog添加到列表中但是,根据对?super Dog …的理解,它应该允许Dog和Dog的super
....所以我应该也可以将Animal添加到列表中?但是出现编译错误。

我认为这个问题是因为write(List<? super Dog>list>仅允许我使用Dog的列表或super的列表来调用write(),并且一旦使用类型调用了它……您只能添加到仅该类型的列表中,对吗?

提前致谢..


阅读 183

收藏
2020-11-30

共1个答案

小编典典

假设我有一个方法:void write(List list),我用List list调用它,write(list)并尝试像list.add(new
Dog())一样添加write(),这是编译错误,为什么?

?是泛型中的通配符运算符,现在的含义是您 不完全知道
自己List要获得哪种类型。所以你怎么可以肯定的是它可以是一个ListDog秒。如果它是a,List<Cat>那么您的write方法将在其中添加一个Dog。因此Java限制您这样做。

现在,如果我使用有界通配符,则write(List list>可以解决上述问题,为什么?

? super Dog代表Dog的任何超类,包括其自身。因此,当您进入时List<? superDog>write您将知道List是其中一个的列表List<Object>orList<Dog>。在这两种情况下,将新添加Dog到列表都是安全的。

2020-11-30