一位同事向我展示了这段代码,我知道它不会工作(事实上,在运行时抛出 ClassCastException
)。
我不知道它为什么编译,因为它从
java.io.FileInputStream
到 org.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/