我得到用下面的代碼的錯誤(摘錄如下所述):Map.put使用泛型
public class MyClass {
private Map<String, Subclass1> mapToSubclass1;
private Map<String, Subclass2> mapToSubclass2;
public void update(
final boolean updatesAreSubclass1,
final List<? extends Superclass> updates) {
Map<String, Superclass> mapToUpdate;
if (updatesAreSubclass1) {
mapToUpdate = mapToSubclass1;
} else {
mapToUpdate = mapToSubclass2;
}
updates.stream().forEach((entity) -> {
mapToUpdate.put(entity.getId(), entity);
});
}
}
其中Subclass1
和Subclass2
延伸Superclass
,和Superclass
提供public String getId();
。
正如我寫的,在嘗試定義mapToUpdate - Incompatible types. Required: Map<String, foo.bar.Superclass>, Found: Map<String, foo.bar.Subclass1>
(或子類2,在else子句中)時會出錯。
如果我改變mapToUpdate到Map<String, ? extends Superclass>
,我試圖put
當得到一個錯誤 - Wrong 2nd argument type. Found: 'foo.bar.Superclass', required '? extends foo.bar.Superclass'
我認爲這是協方差的概念做的,但我不知道如何解決問題。我想到了,沒有滿意的一對夫婦的解決方案:
- 我應該需要兩個
update
方法,每個子類(如果有兩個以上這很快就會變得混亂)? - 我是否應該將
put
移至if (updatesAreSubclass1)
條款中,並將updates
轉換爲相應的List<Subclass>
?
我不知道我是否理解正確,但不是可以將子類映射投影到mapToUpdate嗎? mapToUpdate =(HashMap)(Map)mapToSubclass1; –
Juan