为什么在下面的代码中没有出现编译错误?我得到一个ClassCastException
有点混乱的地方。是因为它们有关系吗?
class Ink {}
Interface Printable {}
class ColorInk extends Ink implements Printable {}
class BlackInk extends Ink {}
class TwistInTaleCasting {
public static void main(String args[]) {
Printable printable = null;
BlackInk blackInk = new BlackInk();
printable = (Printable)blackInk;
}
}
为什么在下面的代码中没有出现编译错误?
因为编译器只关心您要强制转换的表达式的静态类型。
看这两行:
BlackInk blackInk = new BlackInk();
printable = (Printable)blackInk;
您知道在第二行中,由于第一行,该值blackInk
仅引用类型的对象BlackInk
,而编译器则没有。对于所有的编译器知道(编译第二线时),它可能实际上已经:
BlackInk blackInk = new PrintableBlackInk();
printable = (Printable)blackInk;
...哪里PrintableBlackInk
有扩展BlackInk
和实现的类Printable
。因此它是有效的(在编译时),以铸造从类型的表达式BlackInk
来Printable
。如果你做BlackInk
一个final
类,那么编译器知道有没有办法,这将工作(除非值为null),并会在编译时失败,就像这样:
error: inconvertible types
printable = (Printable)blackInk;
^
required: Printable
found: BlackInk
其详细信息在JLS 5.5.1中。
否则,我们必须等到执行时才能看到失败,因为强制转换在编译时有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句