我无法理解为什么编译器认为这个代码错了:
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教程试图解释它,但我仍然有我的问题。
有人可以澄清一下吗?
答案 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>
实际上变为只读。