java - ClassCastException 但仍然编译

标签 java casting

一位同事向我展示了这段代码,我知道它不会工作(事实上,在运行时抛出 ClassCastException )。

我不知道它为什么编译,因为它从 java.io.FileInputStreamorg.springframework.core.io.InputStreamSource; 它们都没有实现相同的接口(interface)或在层次结构中扩展相同的类。

try (InputStream fileInputStream = new FileInputStream("somefile")) {

    InputStreamSource file = (InputStreamSource) fileInputStream;

    // some code

} catch (IOException e) {
    // some code
}

各个文档类的链接: FileInputStream , InputStreamSource

最佳答案

I don't know why it compiles...

因为它是非final 引用类型和接口(interface)之间的显式转换。引用类型之间的显式转换对编译器说:“看,我(程序员)知道这个转换在运行时是有效的。相信我。”确实如此。当然,后来在运行时,由于程序员错误,它失败了。

不过,编译器不会盲目信任程序员。详见§JLS5.5 ,但是如果编译器可以证明强制转换不可能有效,它仍然会拒绝强制转换。但是,在您的情况下它不能这样做,因为 InputStreamSource 是一个接口(interface),而 FileInputStream 是一个非final类。所以 FileInputStream 很可能指的是一些实现了 InputStreamSource 的子类对象。 (当然,我们可以通过查看它来判断它不是,因为它只是设置为 new FileInputStream 的结果。但是编译器不会看很难,它只关心转换中涉及的类型。)

关于java - ClassCastException 但仍然编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58080189/

相关文章:

java - 在 iText 中创建文档而不指定输出

java - 为什么我不能在 Java 中将(字节)数据类型转换为(短)数据类型

c - 用 0xFF 屏蔽字符和强制转换(无符号字符)有什么区别

c# - 在 C# 中链接方法时如何进行转换

delphi - 集合的内存布局

c - 将 double 类型转换为字符串 - 将 double 连接到字符串

java - 以编程方式编译 Xtend 类不起作用

java - 将 servlet 转换为 Web 服务

java - 具有内部 ImmutableList 的映射的嵌套 groupingBy?

java - 在 PApplet 上设置默认关闭操作(处理中)