泛型中的通配符类型

时间:2012-08-24 10:24:55

标签: java generics

  

可能重复:
  Adding an element inside a wildcard type 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教程试图解释它,但我仍然有我的问题。 有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:3)

对于编译器,此? extends Employee表示Employee的一个特定子类型,编译器无法检测哪个子类型。因此,它不允许您只插入任何员工。

有关更多信息,请参阅此问题: What is PECS (Producer Extends Consumer Super)?
或阅读Angelika Langer撰写的Generics FAQ

答案 1 :(得分:2)

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

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