我刚刚在OCA-Book(Oracle认证助理)中读到:
"某些强制转换异常可以在编译时检测为错误,但其他异常只能在运行时检测到#34;。
现在我试图找到两种情况的例子:编译时和运行时。
考虑以下类结构:
class A {}
class B extends A {}
class C extends B {}
以下演员
Object o = new C();
B b = (B) o;
是对的。因此代码将在没有ClassCastException
的情况下运行。
演员
Object o = new B();
C c = (C) o;
错了。对象o
至少属于B
类型;所以它可以转换为B
或A
。
但是可以在运行时或编译时检测到这个吗? 我猜想在编译时?!或者编译器是否只知道引用的类型,而不知道对象(在内存中)本身?如果是这样,编译器无法在编译时决定强制转换是否正确。
感谢您的帮助!
答案 0 :(得分:4)
或者编译器只知道引用的类型,而不知道对象(在内存中)本身的类型吗?
它只知道您尝试强制转换的表达式的类型。该表达式的类型为Object
,因此就编译器而言,可以将其强制转换为C
。虽然语言可以被设计为在编译时捕获这个错误,但是确定编译器必须推断的内容的精确语义以及它无法推断出的内容将是毛茸茸的......并且你真的不希望某些编译器允许的代码和某些不允许的代码。
这会在编译时失败:
String s = "";
C c = (C) s; // Can't possibly be true