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

带有通配符的列表会导致通用伏都教错误

秦渝
2023-03-14
问题内容

有谁知道为什么以下代码无法编译?add()和addAll()均无法按预期工作。删除“?extends”部分可以使所有工作正常,但是我将无法添加Foo的子类。

 List<? extends Foo> list1 = new ArrayList<Foo>();
 List<? extends Foo> list2 = new ArrayList<Foo>();

 /* Won't compile */
 list2.add( new Foo() ); //error 1
 list1.addAll(list2);    //error 2

错误1:

IntelliJ说:

add(capture<? extends Foo>) in List cannot be applied to add(Foo)

编译器说:

cannot find symbol
symbol  : method addAll(java.util.List<capture#692 of ? extends Foo>)
location: interface java.util.List<capture#128 of ? extends Foo>

错误2:

IntelliJ给我

addAll(java.util.Collection<? extends capture<? extends Foo>>) in List cannot be applied to addAll(java.util.List<capture<? extends Foo>>)

而编译器只是说

cannot find symbol
symbol  : method addAll(java.util.List<capture#692 of ? extends Foo>)
location: interface java.util.List<capture#128 of ? extends Foo>
        list1.addAll(list2);

问题答案:

(我在这里假设BarBaz都是的子类型Foo。)

List<? extends Foo>表示 某种类型的元素的列表,这是Foo的子类型,但我们不知道哪种类型 。此类列表的示例为a
ArrayList<Foo>,a LinkedList<Bar>和a ArrayList<Baz>

由于我们不知道哪个子类型是类型参数,因此无法将Foo对象BarBaz对象放入其中。但是我们仍然知道type参数是的子类型Foo,因此列表中已经存在的每个元素(可以从列表中获取)都必须是一个Foo对象,因此我们可以使用
Foo f = list.get(0);类似的东西。

这样的列表只能用于将元素从列表中取出,而不能用于添加任何元素(除了null,但我不知道编译器是否实际上允许这样做)。

List<Foo>另一方面允许添加任何对象,它是一个Foo对象-
与作为BarBaz是的亚型Foo,所有BarBaz对象是Foo对象,所以它们可以被添加,太。



 类似资料:
  • 考虑以下示例: 我知道下界通配符接受通配符中给定类的所有超类(这里是IOException)。 为什么在上述情况下编译器会显示编译错误?

  • 问题内容: 我在项目中创建了一个工厂类,从理论上讲,该类允许我为任何(受支持的)给定类型创建管理器。与管理器进行交互使我可以更改给定类型的某些属性。我面临的问题是,当我尝试为泛型类型创建管理器时,编译器粉碎了我的希望和梦想。 以下代码是我正在使用的简化版本。我尝试创建“ test3Manager”的行将不会编译,并且我试图了解为什么会这样。它下面的线显示了一种“解决方法”,我正试图避免这种情况。

  • 与有界通配符相关的编译器错误 应兼容的不兼容通配符类型

  • 我不明白为什么会出现这些编译错误: 1: 类型列表中的add(capture#1-of?extends Exec.Bird)方法不适用于参数(Exec.Sparrow) 2: 方法添加(捕获#2-of?扩展Exec.Bird)类型列表中的参数(Exec.鸟)

  • 问题内容: 我尝试将正则表达式匹配为app.yaml中的目录名的尝试不起作用: 尽管此官方规范说正则表达式语法受支持。有办法使这项工作吗? 即应该匹配静态文件。 琐事 我使用Google App Engine服务Go Webapp。 我想最大程度地延长浏览器缓存的寿命,最大程度地减少请求数,并仍提供我的css / js / png的新版本,并且我相信修改文件名是实现此目的的最佳实践。另外,由于添加

  • 我试图使用JSoup从超文本标记语言文档中选择一些文本。 我感兴趣的超文本标记语言是表单的一部分: 我对获取任何