为什么我在下面的代码中没有得到一个编译错误?我得到了一个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;
}
}
字符串
3条答案
按热度按时间kgsdhlau1#
为什么我在下面的代码中没有得到编译错误?
因为编译器只关心你试图转换的表达式的静态类型。
看看这两行:
字符串
blackInk
只引用了第一行中的BlackInk
类型的对象,但编译器不知道。对于编译器所知道的一切(当编译第二行时),它 * 可能 * 实际上是:型
.其中
PrintableBlackInk
是一个扩展BlackInk
并实现Printable
的类。因此它是有效的(在编译时)将BlackInk
类型的表达式转换为Printable
。如果将BlackInk
设置为final
类,那么编译器就知道它不可能工作(除非值为null),并且在编译时会失败,就像这样:型
详细信息见JLS 5.5.1。
否则,我们必须等到执行时才能看到失败,因为强制转换在编译时是有效的。
s5a0g9ez2#
ClassCastException是运行时异常,这就是为什么你编译代码,但在运行时得到ClassCastException。你也可以检查javadoc- ClassCastException扩展了RuntimeException:http://docs.oracle.com/javase/7/docs/api/java/lang/ClassCastException.html
你得到ClassCastException的原因很明显是因为你试图将BlackInk的示例转换为Printable(当你将一个对象转换为一个它不是示例的子类时,你将在运行时得到ClassCastException)。简而言之,当你在转换时,你使用的是类型转换,它需要是一个有效的操作,否则你将在运行时得到ClassCastException。
bn31dyow3#
安装程序将正确编译。但是在运行时,由于
TwistInTaleCasting
和Printable
没有关系,因此会抛出类强制转换异常。由于ClassCastException是notchecked exception,因此可以在代码中不处理任何此类情况。