我有一个简单的foo类,并且可以强制转换为集合接口(Map或List),而不会出现任何编译器错误。请注意,Foo该类不实现任何接口或扩展任何其他类。
foo
Map
List
Foo
public class Foo { public List<String> getCollectionCast() { return (List<String>) this; // No compiler error } public Map<String, String> getCollection2Cast() { return (Map<String, String>) this; // No compiler error } public Other getCast() { return (Other)this; // Incompatible types. Cannot cast Foo to Other } public static class Other { // Just for casting demo } }
当我尝试将类转换为集合时,为什么Java编译器不返回 不兼容类型错误Foo?
Foo没有实现Collection。我预计会出现不兼容的类型错误,因为给定当前的Foo类签名,所以不能是Collection。
Collection
不是因为它们是集合类,而是因为它们是 接口 。Foo没有实现它们,但是可以实现它的子类。因此,这不是编译时错误,因为这些方法可能对子类有效。在 运行时 ,如果this不是实现这些接口的类,则自然是运行时错误。
this
如果更改List<String>为ArrayList<String>,则也会由于该Foo子类实现List,但不能扩展ArrayList(因为不能扩展Foo),因此也会出现编译时错误。同样,如果您使用make Foo final,则编译器将为您的接口类型转换给您一个错误,因为它知道它们永远不可能是真实的(因为Foo不能有子类,并且不能实现这些接口)。
List<String>
ArrayList<String>
ArrayList
final