为什么会显示compile_error?

时间:2009-07-12 02:19:37

标签: java generics

代码:(显示编译错误的行为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>

2 个答案:

答案 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

它描述了确切的问题。