这是我的代码。编译器拒绝编译它:
private transient List<? extends Map<String, Object>> donnees;
// ...
public <M extends Map<String, Object>> void addDonnee(M nouvelleDonnee) {
getDonnees().add(nouvelleDonnee);
}
public List<? extends Map<String, Object>> getDonnees() {
// ...
return donnees;
}
为什么我会收到此错误?
The method add(capture#4-of ? extends Map<String,Object>) in the type List<capture#4-of ? extends Map<String,Object>> is not applicable for the arguments (M)
修改 我在这里如何解决我的问题:
private transient List<Map<String, Object>> donnees;
// ...
public void addDonnee(Map<String, Object> nouvelleDonnee) {
getDonnees().add(nouvelleDonnee);
}
public List<Map<String, Object>> getDonnees() {
// ...
return donnees;
}
现在编译器很开心! :)
答案 0 :(得分:3)
getDonnees
方法返回实现Map<String,Object>
的“某事”列表。例如,它可以是TreeMap
或HashMap
的列表;没有办法知道。
由于您不知道列表的确切组件类型,因此无法向其添加任何内容。例如,您可能尝试将HashMap
添加到TreeMap
。
这两个方法应该以某种方式使用相同的参数,例如使用类声明的参数:
class SomeClass<M extends Map<String, Object>> {
public void addDonnee(M nouvelleDonnee) {
getDonnees().add(nouvelleDonnee);
}
public List<M> getDonnees() {
// ...
return donnees;
}
}
答案 1 :(得分:2)
?
和M
都是子类,可能无法相互转换。尝试声明donnees
:
private transient List<Map<String, Object>> donnees;
答案 2 :(得分:1)
您无法在定义为List
的{{1}}中插入任何内容。
JDK documentation中详细讨论了这一点(参见页面底部)。
答案 3 :(得分:1)
Java抱怨,因为它不知道donnees
,addDonnee
和getDonnees
的类型是相同的。一个可以是List<HashMap<String, Object>>
,而其他可以是List<TreeMap<String, Object>>
,它们不兼容(您无法将HashMap
添加到List<TreeMap>
,反之亦然)
您可以在类中添加通用参数:
public class SomeClass<T extends Map<String, Object>>
{
private transient List<T> donnees;
public void addDonnee(T nouvelleDonnee) {
getDonnees().add(nouvelleDonnee);
}
public List<T> getDonnees() {
return donnees;
}
}