【问题标题】:java.lang.ClassCastException at runtime or compile-time [duplicate]运行时或编译时的 java.lang.ClassCastException [重复]
【发布时间】:2016-10-06 00:11:41
【问题描述】:

我刚刚读到一本 OCA-Book(Oracle 认证助理):

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

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

考虑以下类结构:

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 类型;所以它可以转换为BA

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

感谢您的帮助!

【问题讨论】:

  • 是runtime,编译器怎么会事先知道Object的类型?
  • 你可以试试看——写个小程序,试着编译一下,看看编译器有没有报错;如果它编译,尝试运行它,看看你是否得到一个ClassCastException

标签: java classcastexception


【解决方案1】:

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

它只知道您尝试转换的表达式的类型。该表达式的类型为Object,因此就编译器而言,可以将其转换为C。虽然语言可以被设计为让这个错误在编译时被捕获,但确定编译器必须推断什么和不能推断什么的精确语义会很麻烦......你真的不想要some编译器允许而some不允许的代码。

这会在编译时失败:

String s = "";
C c = (C) s; // Can't possibly be true

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多