7

为什么会出现以下

public class ListBox {
    private Random random = new Random();
    private List<? extends Collection<Object>> box;

public ListBox() {
    box = new ArrayList<>();
}

public void addTwoForks() {
    int sizeOne = random.nextInt(1000);
    int sizeTwo = random.nextInt(1000);

    ArrayList<Object> one = new ArrayList<>(sizeOne);
    ArrayList<Object> two = new ArrayList<>(sizeTwo);

    box.add(one);
    box.add(two);
}

public static void main(String[] args) {
    new ListBox().addTwoForks();
}
}

不行?只是为了学习而玩弄泛型,我希望我能够在其中插入任何扩展 Collection 的东西,但我得到了这个错误:

The method add(capture#2-of ? extends Collection<Object>) in the type List<capture#2-of ? extends Collection<Object>> is not applicable for the arguments (ArrayList<Object>)
The method add(capture#3-of ? extends Collection<Object>) in the type List<capture#3-of ? extends Collection<Object>> is not applicable for the arguments (ArrayList<Object>)

at ListBox.addTwoForks(ListBox.java:23)
at ListBox.main(ListBox.java:28)
4

1 回答 1

13

你已经声明box是一个List扩展Collection的东西Object。但根据 Java 编译器,它可以是任何可以扩展的东西Collection,即List<Vector<Object>>. 因此,add出于这个原因,它必须禁止采用泛型类型参数的操作。它不能让您将一个添加ArrayList<Object>到一个List可能是List<Vector<Object>>.

尝试删除通配符:

private List<Collection<Object>> box;

这应该有效,因为您当然可以将 a 添加ArrayList<Object>到 a Listof Collection<Object>

于 2013-04-30T16:58:58.570 回答