1

可能重复:
在通配符类型 ArrayList 中添加元素

我不明白为什么编译器认为这段代码是错误的:

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo);
Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK
wildcardBuddies.setFirst(lowlyEmployee); // compile-time error

有的方法Pair<? extends Employee>有:

? extends Employee getFirst()
void setFirst(? extends Employee)

目前尚不清楚为什么我们不能设置值,因为Employee? extends Employee. Java教程试图解释它,但我仍然有我的问题。有人可以澄清一下吗?

4

2 回答 2

3

对于编译器来说,这? extends Employee意味着 Employee 的一个特定子类型,并且编译器无法检测是哪个子类型。所以它不能让你插入任何员工。

有关更多信息,请参阅此问题: 什么是 PECS(生产者扩展消费者超级)?
或阅读Angelika Langer的泛型常见问题解答。

于 2012-08-24T10:28:31.050 回答
2

不要读<? extends Employee>作“任何扩展 Employee 的类型”,而是读作“扩展 Employee 的特定但未知的类型”。

wildcardBuddies 仍然是一对经理,只是现在实际类型现在未知。我们知道我们可以让员工离开,但我们不能设置任何东西,因为我们不知道应该设置 Managers 还是 LowlyEmployees。Pair<? extends Employee>有效地变为只读。

于 2012-08-24T10:32:17.857 回答