java - 类型转换 "with"接口(interface)

标签 java

interface I{}
class A implements I{}
class B{}

第一:

I[] arr = new A[10];
arr[0] = (I) new B(); // will produce ClassCastException at runtime

第二: 其中,如果我使用具体类

I[] arr = new A[10];
arr[0] = (A) new B(); // will produce compile-time error

如果在我的第一个示例中,(I) new B(),java 编译器也应该产生编译错误,有什么区别?

不是说java编译器应该能够区分它也是“不可转换类型”吗?尤其是当 new 运算符立即出现时?

是否有任何实例/机会表明创建 B 的新实例可能会产生 I型的敞篷车?

我知道在某些时候,Java 编译器不应该立即说这是编译器错误,就像当你这样做时:

I i = (I) getContent(); // wherein getContent() will return a type of Object

编辑:

让我澄清这个问题,为什么它不可能与此重复:Cast reference of known type to an interface outside of type's hierarchy

这个问题的目的不是因为我不知道会导致什么结果或有什么问题等等。

我只是想知道“以技术方式更详细的解释”为什么 JVM 会这样,或者为什么 Java 会做出不让这种场景编译的决定-时间 错误。

众所周知,在编译时而不是在运行时查找“有问题的代码”总是更好。

另一件事,我正在寻找的答案是在这个线程上找到的,而不是在那些“重复?”上。

最佳答案

关于什么强制转换在编译时合法的规则只考虑静态类型。

当Java编译器分析表达式(I) new B()时,发现表达式new B()的静态类型是B 。我们可以判断出 new B() 不可能是 I 的实例,但编译时分析规则无法判断该对象实际上不是B 子类的一个实例,它实现了 I

因此,编译器必须让它通过。根据编译器的复杂程度,它可能会检测到异常并发出某种警告,但同样 1/0 不是编译时错误,这不可能是编译时错误。

关于java - 类型转换 "with"接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24158650/

相关文章:

java - 使用 Zomato API 搜索附近的餐厅

java - 集成测试 DropWizard 应用程序

java - 主要 Java 库不会预测文件 “cyclic copy” 到不同映射目标的情况

java - 无法将 Java 中提供程序的标签名称发送到 Pact Broker

java - Eclipse:尝试创建新项目时出现错误 ".. overlaps the location of another project.."

java - 创建学生文件,查看平均成绩高于5的学生信息以及每个学生的平均成绩

java - 愚蠢的问题: What's the difference between PlayerView and SimpleExoPlayerView?

java - Swing 布局 - 在保持组件尺寸的同时使用网格

java - int[] 数组(从低到高排序)

java - 我们能否将测试结果 TestNG 报告或范围报告集成到 Microsoft 团队