java 为什么是ClassCastException而不是编译错误?

yptwkmov  于 5个月前  发布在  Java
关注(0)|答案(3)|浏览(63)

为什么我在下面的代码中没有得到一个编译错误?我得到了一个ClassCastException,这有点令人困惑。是因为它们是相关的吗?

class Ink {}

Interface Printable {}
class ColorInk extends Ink implements Printable {}

class BlackInk extends Ink {}

class TwistInTaleCasting {
   public static void main(String args[]) {
       Printable printable = null;
       BlackInk blackInk = new BlackInk();
       printable = (Printable)blackInk;
   }
}

字符串

kgsdhlau

kgsdhlau1#

为什么我在下面的代码中没有得到编译错误?
因为编译器只关心你试图转换的表达式的静态类型。
看看这两行:

BlackInk blackInk = new BlackInk();
printable = (Printable)blackInk;

字符串

  • 你 * 知道在第二行中,值blackInk只引用了第一行中的BlackInk类型的对象,但编译器不知道。对于编译器所知道的一切(当编译第二行时),它 * 可能 * 实际上是:
BlackInk blackInk = new PrintableBlackInk();
printable = (Printable)blackInk;


.其中PrintableBlackInk是一个扩展BlackInk并实现Printable的类。因此它是有效的(在编译时)将BlackInk类型的表达式转换为Printable。如果将BlackInk设置为final类,那么编译器就知道它不可能工作(除非值为null),并且在编译时会失败,就像这样:

error: inconvertible types
          printable = (Printable)blackInk;
                                 ^
required: Printable
found:    BlackInk


详细信息见JLS 5.5.1。
否则,我们必须等到执行时才能看到失败,因为强制转换在编译时是有效的。

s5a0g9ez

s5a0g9ez2#

ClassCastException是运行时异常,这就是为什么你编译代码,但在运行时得到ClassCastException。你也可以检查javadoc- ClassCastException扩展了RuntimeException:http://docs.oracle.com/javase/7/docs/api/java/lang/ClassCastException.html
你得到ClassCastException的原因很明显是因为你试图将BlackInk的示例转换为Printable(当你将一个对象转换为一个它不是示例的子类时,你将在运行时得到ClassCastException)。简而言之,当你在转换时,你使用的是类型转换,它需要是一个有效的操作,否则你将在运行时得到ClassCastException。

bn31dyow

bn31dyow3#

安装程序将正确编译。但是在运行时,由于TwistInTaleCastingPrintable没有关系,因此会抛出类强制转换异常。由于ClassCastException是notchecked exception,因此可以在代码中不处理任何此类情况。

相关问题