运行时或编译时的 java.lang.ClassCastException

mrb*_*ela 1 java classcastexception

我刚刚在 OCA-Book(Oracle 认证助理)中读到:

“一些转换异常可以在编译时被检测为错误,但其他只能在运行时检测到”。

现在我试图为这两种情况找到一个例子:编译时和运行时。

考虑以下类结构:

class A {}

class B extends A {}

class C extends B {}
Run Code Online (Sandbox Code Playgroud)

以下演员表

Object o = new C();
B b = (B) o;
Run Code Online (Sandbox Code Playgroud)

是正确的。所以代码将在没有ClassCastException.

演员阵容

Object o = new B();
C c = (C) o;
Run Code Online (Sandbox Code Playgroud)

是错的。对象o至少是类型B; 所以它可以被强制转换为Bor A

但是这可以在运行时或编译时检测到吗?我猜在编译时?!还是编译器只知道引用的类型,而不知道对象(内存中)本身的类型?如果这是真的,编译器无法在编译时决定转换是否正确。

感谢您的帮助!

Jon*_*eet 5

还是编译器只知道引用的类型,而不知道对象(内存中)本身的类型?

它只知道您尝试转换的表达式的类型。该表达式是 type Object,因此就C编译器而言,可以将其强制转换为。虽然该语言本可以设计为让这个错误在编译时被发现,但确定编译器必须推断的内容以及它无法推断的内容的精确语义会很麻烦......而且你真的不想要一些编译器允许和一些不允许的代码。

虽然这会在编译时失败:

String s = "";
C c = (C) s; // Can't possibly be true
Run Code Online (Sandbox Code Playgroud)