java - 上限通配符( 扩展) 不起作用;ArrayList <? extends SuperType> 不允许子类型的实例

  显示原文与译文双语对照的内容
0 0

这个问题已经有了如下答案:

从我所知道的有界通配符中,<? extends Object>的类型参数将接受 Object 类型的所有类型。 就像Java教程状态所示:

上面有界的通配符 <? extends Foo> 是任何类型的,它与Foo和Foo的任何子类型匹配

所以如果我有 GridPosition 类型,它扩展 Position? extends Position 应该接受类型 GridPosition

问题

试图将 GridPosition extends Position 实例添加到用类型声明的列表中 ArrayList<? extends Position> 我得到了一个错误:

方法 add(capture#1-of? extends Position) 在类型中 ArrayList<capture#1-of? extends Position> 不适用于参数( GridPosition )

我所引用的代码,最简单的形式:

import java.util.ArrayList;
public class Main {
 public static void main(String[] args) {
 ArrayList<? extends Position> list = new ArrayList<>();
 list.add(new GridPosition());//Error on this line
 }
}
class Position {}
class GridPosition extends Position {}

运行 Java 8u31Eclipse Luna 中错误的图片:

enter image description here

这是 Bug或者我不理解有界通配符?


我注意到 ? super Position 允许我将 GridPosition的实例添加到列表。

当使用带有 <? extends Position> 类型参数的列表时,实例的( 从下面的类) 工作不存在:

class Super {}
class Position extends Super {}
class GridPosition extends Position {}

图片:

enter image description here

时间:原作者:4个回答

0 0

如果要添加到通用列表中,则应使用 superextends 用于读取( 获取等) 操作。 你可以在 Effective Java 中找到细节,Joshua Bloch,项目 28: 使用有界通配符增加API灵活性

原作者:
...