1

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

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

4 回答 4

3

两者?M都是子类,并且不能相互转换。尝试声明donnees

private transient List<Map<String, Object>> donnees;
于 2013-08-22T11:54:13.103 回答
3

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

由于您不知道列表的确切组件类型,因此您无法向其中添加任何内容。例如,您可能正在尝试将 a 添加HashMapTreeMap.

这两种方法应该以某种方式使用相同的参数,例如使用类声明的一种:

class SomeClass<M extends Map<String, Object>> {

  public void addDonnee(M nouvelleDonnee) {
    getDonnees().add(nouvelleDonnee);
  }

  public List<M> getDonnees() {
    // ...
    return donnees;
  }
}
于 2013-08-22T11:51:54.850 回答
1

您不能将任何内容插入List定义为List<? extends Foo>.

这在JDK 文档中有相当详细的讨论(参见页面底部)。

于 2013-08-22T11:51:21.697 回答
1

Java 抱怨是因为它不知道 , 和 的类型donneesaddDonnee相同getDonnees的。一个可能是 a List<HashMap<String, Object>>,而其他可能是 a List<TreeMap<String, Object>>,它们不兼容(您不能将 a 添加HashMap到 a 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;
  }
}
于 2013-08-22T11:52:29.777 回答