为什么可以在没有编译错误的情况下将MyClass
对象转换为List<MyClass>
(只是有'未选中'警告),尽管MyClass
没有实现List接口,并且同时时间不可能以相同的方式投射,例如,String
类。
谢谢。
答案 0 :(得分:3)
如果完全不可能进行转换,编译器将创建编译器错误。但是当你转换为一个接口(并且你的原始类不是final
)时,这个转换可能会成功。
即使它可能不存在,对于尚未写入子类MyClass
并实现List
的类,即使这对我们没有任何意义,也是可能的。
由于这种可能性,编译器必须允许该转换。但是如果没有这样的子类,这仍然会在运行时产生ClassCastException
。
JLS, Section 5.5.1,将S
投射到T
时说明:
如果T是接口类型:
如果S不是最终类(第8.1.1节),那么,如果存在T的超类型X和S的超类型Y,那么X和Y都可以证明是不同的参数化类型,并且X和Y的擦除是相同的,发生编译时错误。
否则,演员在编译时总是合法的(因为即使S没有实现T,S的子类可能)。
如果S是最终类(第8.1.1节),那么S必须实现T,否则会发生编译时错误。
(大胆强调我的)