Java 为什么编译器在进行“编译”时不给出错误;“坏的”;铸造
考虑以下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方法中键入以下内容时,编译器不会给出任何错误,即使该转换将导致错误。
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);
抛出异常。打印编译器错误。不要混淆自己。抛出异常。打印编译器错误。不要混淆自己。