根据我所知的有界通配符,类型参数<? 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}}中的错误图片:
这是一个错误吗?或者我不理解有界的通配符?
我注意到Java 8u31
允许我将? super Position
的实例添加到列表中。
当使用类型参数为GridPosition
的列表时,没有实例(来自下面的类)工作:
<? extends Position>
照片:
答案 0 :(得分:1)
如果要添加到通用列表,则应使用super
。 extends
用于读取(get和etc)操作。您可以在Joshua Bloch的有效Java中找到详细信息,第28项:使用有界通配符来提高API灵活性