java - 为什么编译器在进行 "bad"转换时不给出错误?

标签 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 ??
}

最佳答案

在您的示例中,可能很容易知道强制转换是错误的 - 但在一般情况下并非如此。

如果您有一个也可能返回 Tiger 的方法 Animal getRandomAnimal() 该怎么办? (或更常见的情况是,Animal getAnimal() 方法可能会被子类重写以返回 Tiger)。

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

Tiger tiger = (Tiger)getRandomAnimal();

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

关于java - 为什么编译器在进行 "bad"转换时不给出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14673314/

相关文章:

c - 如何用 C 语言编写编译器?

c++ - 传递模板参数

c - 错误 : initializer element is not computable at load time

c# - 具有可为空文字的非常时髦的 C# 编译器行为

java - 无法捕获 Kafka TopicExistsException

java - 尝试在 hibernate/spring 中创建用户登录的东西

java - 哪些 Java 代码生成 Wide 指令

c - 自动跟踪变量的变化

C++ 按值删除 vector 元素

java - 如何将后端传入的数据存储到周期元素类型的数组对象中