0

考虑以下 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 ??
}
4

2 回答 2

3

在您的示例中,很容易知道演员阵容是错误的 - 但在一般情况下并非如此。

如果您有一个Animal getRandomAnimal()也可能返回的方法怎么办Tiger。(或者更常见的情况,Animal getAnimal()可能被子类覆盖以返回 a 的方法Tiger)。

在编译时,你不可能知道是否

Tiger tiger = (Tiger)getRandomAnimal();

是否有效,这仅在运行时才知道

于 2013-02-03T14:09:19.103 回答
1

因为通常,这在编译时无法检测到。例如:

Animal a = (someCondition) ? new Animal() : new Tiger();

((Tiger)animal).printText(animal);
于 2013-02-03T14:09:32.253 回答