当前位置: 首页 > 面试题库 >

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

卜昂熙
2023-03-14
问题内容

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

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(),并且一旦使用类型调用了它……您只能添加到仅该类型的列表中,对吗?

提前致谢..


问题答案:

假设我有一个方法: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到列表都是安全的。



 类似资料:
  • 我创建了一个元素列表,我想更新其中一个列表元素 这是对update方法的调用: 这是更新方法: 在该方法中,我收到警告“从方法生成函数”,并建议“方法‘update\elem’可能是‘static’” 更新列表元素而不收到警告的正确方法是什么?

  • 我必须编写一些代码,将Java8流的内容多次添加到列表中,我很难找到最好的方法。根据我在SO上读到的内容(主要是这个问题:如何将Java8流的元素添加到现有列表中)和其他地方,我将其缩小到以下选项: PS:在我的示例代码中,我使用作为需要在流上执行的任何操作的占位符

  • 我正在创建一个组件,我希望元素类型是可配置的。 所以容器元素可以是上面的defaultProps中的元素,也可以是组件。 我不能得到的验证,我已经尝试了这个: 但它不能正确验证。 提供给的值的prop无效,

  • 问题内容: 这个清单对象在咬我屁股。 每当我尝试向其中添加元素时,它都会产生以下结果: 产生错误的行无关紧要,但无论如何这里都是这样: 我不应该静态访问它吗? 变量的实际声明: 有任何想法吗?在Google上找不到任何值得的东西。 问题答案: Arrays.asList()将给您返回不可修改的列表,这就是为什么添加失败的原因。尝试使用以下方法创建列表:

  • 我应该如何编写允许我在数组中添加和删除数组项的补丁方法? 项目类别: 菜单模型: 我有一个菜单组件和一个菜单服务。我需要一个补丁方法,将元素添加到菜单内的ItemClass[]数组中,并能够删除它们。 API方法如下所示: (来自https://stackoverflow.com/a/54679303/479251)

  • 问题内容: 据我了解,a 是定义为 一些特定但未知类型 的 列表 。因此,无论此参数的类型是什么,都应该对其进行扩展,因为在Java中,不能有任何不扩展的类型。那么为什么下面的代码没有被编译呢?它如何违反了不变式 问题答案: 可以指向可以存储不同类型对象的任何类型的列表。 您如何看待,例如,让它添加任何对象是否安全?