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

为什么要ClassCastException而不是编译错误?,第1张

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

为什么在下面的代码中没有出现编译错误?

因为编译器只关心您要强制转换的表达式的静态类型

看这两行:

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: Printablefound:    BlackInk

其详细信息在JLS
5.5.1中

否则,我们 必须 等到执行时才能看到失败,因为强制转换在编译时有效。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5490329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存