代码:(显示编译错误的行为3)
Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo);
Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK
wildcardBuddies.setFirst(lowlyEmployee); // compile-time error
错误是关于“不可能腐败”
wildcardBuddies的类型是什么?(Pair<? extends Employee> or Pair<Manager>
)
答案 0 :(得分:3)
代码导致错误的原因是因为无法知道Employee wildcardBuddies将接受哪个特定子类。为什么编译器不确定?为了看到这一点,我们更仔细地查看代码:
Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo);
在这里,我们创建了一对Managers,它是Employee的子类。
Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK
在这里,我们将刚创建的对分配给一对必须是Employee或其子类的对象。请注意,我们在这里创建新对象,只是对第一对进行第二次引用。
wildcardBuddies.setFirst(lowlyEmployee); // compile-time error
现在我们尝试做一些不应该被允许的事情,原因很简单,因为lowlyEmployee 不是经理。请记住,虽然wildcardBuddies是对一对Employee子类型的引用,但它指向的对象非常具体地是一对Managers,并且不允许从超类(Employee)到子类(Manager)的转换。由于编译器无法检查在具有给定参数的实际底层对象上允许调用setFirst()的所有可能情况,因此它有一条规则将禁止所有非法行为以及一些合法行为。
希望这有助于更好地解释PDF中的答案。如果我错了,请有人纠正我。
答案 1 :(得分:1)
我发现了这个:http://userpages.umbc.edu/~edelman/341/Generics.pdf
它描述了确切的问题。