当我有这些代码时:
ASuperClass super1 = new ASuperClass();
ASubClass sub1 = new ASubClass(3);
sub1 = (ASubClass) super1; // this line compiled ok BUT has runtime Error LINE 3
ASubClass sub2 = new ASuperClass(); // this line compiled NOT ok LINE 4
我的问题是,为什么第3行中的错误(“无法将ASuperClass强制转换为ASubClass”)是Runtime Error,但不是类似于第4行中的编译错误的编译错误。这背后的逻辑是什么?
非常感谢!
最佳答案
之所以遇到运行时错误,是因为您告诉编译器(通过显式强制转换)信任您您没有在犯错误,因此它会忽略这些错误,并且不会在编译时检测到它。但是,当程序运行时,您会遇到异常,因为super1
实际上是ASuperClass
而不是ASubClass
。
在第二种情况下,您会遇到编译错误,因为编译器知道您犯了一个错误(例如,您并没有告诉他通过强制转换来信任您)。