有谁知道为什么以下代码无法编译?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);
(我在这里假设Bar
和Baz
都是的子类型Foo
。)
List<? extends Foo>
表示 某种类型的元素的列表,这是Foo的子类型,但我们不知道哪种类型 。此类列表的示例为a
ArrayList<Foo>
,a LinkedList<Bar>
和a ArrayList<Baz>
。
由于我们不知道哪个子类型是类型参数,因此无法将Foo
对象Bar
或Baz
对象放入其中。但是我们仍然知道type参数是的子类型Foo
,因此列表中已经存在的每个元素(可以从列表中获取)都必须是一个Foo
对象,因此我们可以使用
Foo f = list.get(0);
类似的东西。
这样的列表只能用于将元素从列表中取出,而不能用于添加任何元素(除了null
,但我不知道编译器是否实际上允许这样做)。
甲List<Foo>
另一方面允许添加任何对象,它是一个Foo
对象-
与作为Bar
和Baz
是的亚型Foo
,所有Bar
和Baz
对象是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从超文本标记语言文档中选择一些文本。 我感兴趣的超文本标记语言是表单的一部分: 我对获取任何