2013-08-29 72 views
0

我有兩個類:超類Cluster和子類XCluster。 XCluster擴展了Cluster。爲什麼具有超類值的地圖無法接受子類對象?

我有這樣的方法簽名:

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

我有這個變量:

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

我不能編譯這一點。 Eclipse說,方法getCluster()不返回這種類型。我需要將類型從XCluster更改爲Cluster。

怎麼了?

+1

幾分鐘前的類似問題。這裏:http://stackoverflow.com/questions/18513990/why-is-it-not-possible-to-call-listnumber-not-with-listinteger-even-intege –

回答

3

你不能因爲:generics in Java are not polymorphic

你的主要選項(還有其他人):

  • 變更的第2碼

    Map<Integer, ? extends Cluster> clusters = getClusters(); 
    
  • 變化的方法簽名:

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

要使用哪個取決於您的用例。

3

請考慮如果您嘗試將Cluster插入clusters會發生什麼情況。由於getClusters()的結果只能保存XCluster s,因此應該有錯誤。你是正確的,但是,如果你從地圖上檢索任何價值將是一個Cluster,所以你可以做,例如,

Cluster cluster = getClusters().get(0); 
0

Java不能確定值列包含超類。它不會檢查這個粒度級別。

1

Java泛型不允許你這樣做。 Map<Integer, XCluster>類型的對象與Map<Integer, Cluster>類型的對象不同,即使XCluster擴展或實現Cluster,如此處所述:Generics, Inheritance, and Subtypes

相關問題