关于Java:上界通配符(扩展)不工作;扩展父类型>不允许子类型的实例

Upper-bound wildcard (extends) not working; ArrayList<? extends SuperType> doesn't allow instances of subtype

本问题已经有最佳答案,请猛点这里访问。

根据我对有界通配符的了解,的类型参数将接受Object的所有子类型。正如Java教程所描述的:

The upper bounded wildcard, , where Foo is any type, matches Foo and any subtype of Foo

因此,如果我有扩展PositionGridPosition型,? extends Position应该接受GridPosition型。

问题

当试图将EDOCX1的实例(6)添加到用ArrayList类型声明的列表中时,我得到一个错误:

The method add(capture#1-of ? extends Position) in the type ArrayList is not applicable for the arguments (GridPosition)

我所指的代码,以最简单的形式:

1
2
3
4
5
6
7
8
9
10
11
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

这是虫子吗?或者我不理解有界通配符?

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

当使用带有类型参数的列表时,实例(来自下面的类)不起作用:

1
2
3
class Super {}
class Position extends Super {}
class GridPosition extends Position {}

图片:

enter image description here


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