Java 为什么编译器在进行“编译”时不给出错误;“坏的”;铸造

Java 为什么编译器在进行“编译”时不给出错误;“坏的”;铸造,java,compiler-construction,compiler-errors,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方法中键入以下内容时,编译器不会给出任何错误,即使该转换将导致错误。

考虑以下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 ??
}
publicstaticvoidmain(字符串[]args){
动物=新动物();

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

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

在编译时,您不可能知道

Tiger tiger = (Tiger)getRandomAnimal();

是否有效,只有在运行时才知道这一点在您的示例中,可能很容易知道强制转换是错误的,但在一般情况下并非如此

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

在编译时,您不可能知道

Tiger tiger = (Tiger)getRandomAnimal();

是否有效,只有在运行时才知道这一点,因为通常在编译时无法检测到。例如:

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

((Tiger)animal).printText(animal);

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

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

((Tiger)animal).printText(animal);

抛出异常。打印编译器错误。不要混淆自己。抛出异常。打印编译器错误。不要混淆自己。