0

我有两个类:超类 Cluster 和子类 XCluster。XCluster 扩展了 Cluster。

我有这个方法签名:

public Map<Integer, XCluster> getClusters() {
...
}

我有这个变量:

Map<Integer, Cluster> clusters = getClusters();

我无法编译这个。Eclipse 说方法 getCluster() 不返回这种类型。我需要将类型从 XCluster 更改为 Cluster。

怎么了?

4

5 回答 5

5

你不能因为:Java 中的泛型不是多态的

您的主要选择(还有其他选择):

  • 将第二个代码更改为

    Map<Integer, ? extends  Cluster> clusters = getClusters();
    
  • 将方法签名更改为:

    public Map<Integer, Cluster> getClusters() {}
    

使用哪个取决于您的用例。

于 2013-08-29T15:03:39.403 回答
3

考虑一下如果您尝试将 a 插入Clusterclusters. 由于结果getClusters()只能保持XClusters,所以应该有错误。但是,您是正确的,如果您从地图中检索到的任何值都是 a Cluster,那么您可以这样做,例如,

Cluster cluster = getClusters().get( 0 );
于 2013-08-29T15:02:17.100 回答
2

因为 aMap<Integer, XCluster>不是 a Map<Integer, Cluster>。泛型不适用于多态性。您可以阅读有关泛型的多态性这个问题

于 2013-08-29T15:02:52.143 回答
1

Java 泛型不允许您这样做。type 的对象与 typeMap<Integer, XCluster>的对象不同Map<Integer, Cluster>,即使XClusterextends 或 implements Cluster,如下所述:Generics、Inheritance 和 Subtypes

于 2013-08-29T15:03:30.523 回答
0

Java 无法确定 values 列包含超类。它不会在那个粒度级别上进行检查。

于 2013-08-29T15:03:10.740 回答