通用方法无法编译 - 该方法不适用于参数

时间:2013-08-22 11:46:52

标签: java generics

这是我的代码。编译器拒绝编译它:

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;
}

现在编译器很开心! :)

4 个答案:

答案 0 :(得分:3)

getDonnees方法返回实现Map<String,Object>的“某事”列表。例如,它可以是TreeMapHashMap的列表;没有办法知道。

由于您不知道列表的确切组件类型,因此无法向其添加任何内容。例如,您可能尝试将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抱怨,因为它不知道donneesaddDonneegetDonnees的类型是相同的。一个可以是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;
  }
}