当我有这些代码时:
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
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么第3行中的错误("ASuperClass不能转换为ASubClass")第3行是运行时错误但不是编译错误类似于第4行中的错误,这是一个编译错误.这背后的逻辑是什么?非常感谢!
你得到一个运行时错误,因为你告诉编译器(通过显式转换)相信你没有犯错,所以它忽略了错误并且在编译时没有检测到它.但是当程序运行时,你会得到一个例外,因为super1它实际上是a ASuperClass而不是a ASubClass.
在第二种情况下,你得到一个编译错误,因为编译器知道你犯了一个错误(并且你没有告诉他通过施放来信任你).