为什么编译器在进行“坏”演员表时不会出错?

时间:2013-02-03 14:06:46

标签: java compiler-construction compiler-errors

考虑遵循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 ??
}

2 个答案:

答案 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);