一尘不染

为什么Java让您强制转换为集合?

java

我有一个简单的foo类,并且可以强制转换为集合接口(MapList),而不会出现任何编译器错误。请注意,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


阅读 285

收藏
2020-12-03

共1个答案

一尘不染

不是因为它们是集合类,而是因为它们是 接口Foo没有实现它们,但是可以实现它的子类。因此,这不是编译时错误,因为这些方法可能对子类有效。在
运行时 ,如果this不是实现这些接口的类,则自然是运行时错误。

如果更改List<String>ArrayList<String>,则也会由于该Foo子类实现List,但不能扩展ArrayList(因为不能扩展Foo),因此也会出现编译时错误。同样,如果您使用make
Foo final,则编译器将为您的接口类型转换给您一个错误,因为它知道它们永远不可能是真实的(因为Foo不能有子类,并且不能实现这些接口)。

2020-12-03