java - 为什么在 Java 中类型与转换的不兼容性在运行时检查,类型不匹配在编译时转换?

标签 java compiler-errors runtimeexception

假设有 2 个类。 Child 扩展 Parent

public class Parent {}

public class Child extends Parent {}

我知道下面的代码是错误的:

Child obj = new Parent(); // causes java.lang.Error

Child obj = (Child) new Parent(); // causes java.lang.ClassCastException

但我不明白为什么在第一种情况下会出现编译错误,而在第二种情况下会出现运行时异常。毕竟,父项永远不能转换或转换为子项。 为什么第二种情况在编译时没有检查?

如果有一个清晰合理的想法,我将不胜感激!

最佳答案

Child obj = new Parent();

在这种情况下,编译器会尝试检查(隐式转换)Parent 对象是否可以设置为 Child 引用,当此转换失败时,您会收到编译时错误。

Child obj = (Child) new Parent();

在这种情况下,编译器会发现您正在显式地将 Parent 对象转换为 Child,因此编译器将它留给运行时来决定转换是否有效,在感觉开发人员负责类型转换。因此,如果此转换失败,则会出现运行时错误。

关于java - 为什么在 Java 中类型与转换的不兼容性在运行时检查,类型不匹配在编译时转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16266559/

相关文章:

java - 使用 Spring Boot 每 10 分钟将数据流式传输到 SQL 数据库

java - 为什么我的 Java "for"循环立即结束?

gcc - Bison 解析器总是打印 "syntax error"

java - 有关 Java 无法从同一目录中的 .class 中找到符号的更多信息

java - 如何删除 java.lang.IndexOutOfBoundsException?

java - Java中的线程中断

java - com.itextpdf.kernel.PdfException : Document has no pages

c++ - 编译器说了多个定义,但我找不到任何定义

android - 特有的android RuntimeException

java - Ant 错误 "Exception in thread "AWT-EventQueue- 0"java.lang.NoClassDefFoundError: com/sun/jna/Library"