【发布时间】:2015-03-02 03:24:59
【问题描述】:
我有一个超类 Animal 和两个子类:Cat 和 Dog。 Dog 类有一个自己独有的新方法,称为 playFetch()。
现在,我这样做:
Animal G = new Cat("Tom");
((Dog) G).playFetch();
那么,编译器在没有任何错误的情况下编译它之前到底是怎么想的。它是否认为...“好吧,Trent 正在将动物对象引用转换为 Dog 对象引用的引用类型,我认为这没有错,因为 Dog 也是动物并且 Dog 具有方法 playFetch()”?
在运行期间,嗯……我们知道会发生什么。请说服我为什么编译器不抱怨。还是我的论点正确?
【问题讨论】:
-
强制转换是编译器请求将引用视为对指定类型对象的引用。即在这种情况下不抱怨的请求。幸运的是,在 Java 中,有运行时类型检查,所以你会得到一个漂亮的错误。在其他语言中,您实际上不会在运行时收到错误...只是奇怪的结果。
-
你已经投了它,所以你要对它是否在逻辑上有意义负责。尽管确实这种情况显然是一个错误,但编译器确定是否进行了不正确的转换并不需要太多时间——如果不是不可能的话。或许你应该看看静态代码分析。
标签: java