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

Khiem-Kim Ho Xuan:

为什么在下面的代码中没有出现编译错误?我得到一个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;
   }
}
乔恩·斯基特(Jon Skeet):

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

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

看这两行:

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

知道在第二行中,由于第一行,该值blackInk仅引用类型的对象BlackInk,而编译器则没有。对于所有的编译器知道(编译第二线时),它可能实际上已经:

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

...哪里PrintableBlackInk有扩展BlackInk和实现的类Printable因此它是有效的(在编译时),以铸造从类型的表达式BlackInkPrintable如果你做BlackInk一个final类,那么编译器知道有没有办法,这将工作(除非值为null),并会在编译时失败,就像这样:

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

其详细信息在JLS 5.5.1中

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

java的IntStream无法收集使用(Collectors.toList()),编译错误,为什么呢?

摇篮5的Java 11编译错误:为什么摇篮认为我使用Java 10?

为什么使用方法参照以下铸件不会产生编译错误?

为什么= +不会导致编译错误?

为什么要使用uImage而不是zImage

为什么要使用jQuery on()而不是click()

ClassCastException与“无法转换”编译错误

为什么数组的负数大小不是编译错误而是抛出java.lang.NegativeArraySizeException

为什么要使用IHttpActionResult而不是HttpResponseMessage?

为什么要使用var而不是类型?

为什么要使用Runnable而不是Thread?

为什么返回对函数局部值的引用不是编译错误?

为什么调用纯虚拟链接器错误而不是编译错误?

为什么我会得到编译错误“使用删除的功能'std :: unique_ptr ...”

为什么删除void *是UB而不是编译错误?

为什么某些类型的Set缺少运行时错误而不是编译错误?

为什么要使用beforeRouteEnter而不是挂载?

为什么将结构强制转换为AnyObject而不是迅速的编译错误?

如果将类对象传递给scanf,为什么它不是编译错误?

为什么要使用移位而不是for循环?

为什么声明一个叫做cin的std :: ifstream不是编译错误?

为什么这个[haskell]编译错误?

为什么要使用Char而不是String?

为什么要使用fillRect而不是translation?

为什么要使用资源而不是路由?

为什么这些表达式给我输出而不是编译错误?

为什么要使用isinstance()而不是type()?

如果我重新定义方法参数,为什么不是编译错误?

为什么我有编译错误?