考虑遵循Java类:
public class Animal {
public static void printText(Object obj) {
System.out.println(obj.toString());
}
}
class Tiger extends Animal {
// Contains some unimportant methods.
}
现在,当在main方法中键入以下内容时,即使该转换将导致错误,编译器也不会给出任何错误。为什么呢?
public static void main(String[] args) {
Animal animal = new Animal();
((Tiger)animal).printText(animal); // <= ?? no error in the compiler ??
}
答案 0 :(得分:3)
在你的例子中,可能很容易知道演员表是错的 - 但在一般情况下它不是。
如果您的方法Animal getRandomAnimal()
也可能返回Tiger
,该怎么办? (或者更常见的情况是,方法Animal getAnimal()
可能被子类覆盖以返回Tiger
)。
在编译时,您无法知道是否
Tiger tiger = (Tiger)getRandomAnimal();
是否有效,仅在运行时知道。
答案 1 :(得分:1)
因为通常在编译时无法检测到这一点。例如:
Animal a = (someCondition) ? new Animal() : new Tiger();
((Tiger)animal).printText(animal);