2009-07-12 154 views
0

代码:?(这将显示编译错误的行3)为什么会显示compile_error?

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

什么是错误? – Sean 2009-07-12 02:26:35

+0

lowlyEmployee来自哪里? – Tom 2009-07-12 02:38:51

回答

3

代码导致错误的原因是因为无法知道Employee wildcardBuddies的特定子类将接受哪些子类。为什么编译器不确定?为了看到这一点,我们仔细看看代码:

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo); 

这里我们创建一对经理,它是Employee的一个子类。

Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK 

在这里,我们将刚刚创建的对分配给一对必须是Employee或其子类的对象。请注意,我们不是在此创建一个新对象,只是对第一对进行第二次引用。

wildcardBuddies.setFirst(lowlyEmployee); // compile-time error 

现在我们尝试做一些不应该被允许的原因很简单,lowlyEmployee 不是经理。请记住,虽然wildcardBuddies是对一对Employee子类型的引用,但它指向的对象特别是一对经理,并且不允许从超类(Employee)转换为子类(Manager)。由于编译器无法检查所有可能的场景,其中调用setFirst()将被允许在具有给定参数的实际底层对象上,它有一条规则将禁止所有非法行为以及一些合法行为。

希望这有助于更好地解释PDF中的答案。如果我对任何事情都有错,请有人纠正我。

相关问题