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

时间:2015-03-20 04:22:41

标签: java generics compiler-errors bounded-wildcard

根据我所知的有界通配符,类型参数<? extends Object>将接受所有类型为Object的子类型。正如Java教程所述:

  

上限有界的通配符<? extends Foo>,其中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 {}

运行Eclipse Luna的{​​{1}}中的错误图片:

enter image description here

这是一个错误吗?或者我不理解有界的通配符?


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

当使用类型参数为GridPosition的列表时,没有实例(来自下面的类)工作:

<? extends Position>

照片:

enter image description here

1 个答案:

答案 0 :(得分:1)

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