2012-08-24 71 views
1

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

+0

'lowlyEmployee'是什么类型? –

+0

雇员的子类型 – damluar

回答

3

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

欲了解更多信息请参考这个问题: What is PECS (Producer Extends Consumer Super)?
或阅读Generics FAQ由安格兰格。

+0

在我的理解中,“?extends Employee”是以Employee为父类型的任何类型。因此,如果我们知道集合包含员工的子类型,那么我们可以在其中放置“经理”和“兼职员工”。但是,如果我们只考虑一个特定的亚型,那么我的假设是错误的。 – damluar

+0

谢谢PECS,当我搜索答案时,它不在名单上。 – damluar

+0

你的理解有点偏离。它意味着一种特定的类型是Employee的子类型。它不会匹配任何旧的Employee对象。看到这个答案我给了更详细的解释。 http://stackoverflow.com/questions/11955515/t-extends-aninterface-vs-extends-aninterface/11955957#11955957 – Matt

2

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

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

+0

谢谢,我明白了! – damluar