【问题标题】:Java create map of Generic ObjectsJava 创建通用对象的映射
【发布时间】:2014-11-06 15:08:57
【问题描述】:

我有一个 Node 类:

public class Node<T extends MySuperClass> {

   private T data;
   private Node<? extends MySuperClass> parent;
   private List<Node<? extends MySuperClass>> children;

   public Node(T data, Node<? extends MySuperClass> parent, List<Node<? extends MySuperClass>> children) {
     this.data = data;
     this.parent = parent;
     this.children = children;
   }

   public T getData() {
      return data;
   }

   public Node<? extends MySuperClass> getParent() {
          return parent;
   }

   public List<Node<? extends MySuperClass>> getChildren() {
          return children;
   }

   public void setData(T data) {
         this.data = data;
   }

   public void setParent(Node<? extends MySuperClass> parent) {
         this.parent = parent;
   }

   public void setChildren(List<Node<? extends MySuperClass>> children) {
          this.children = children;
   }
}

我需要创建上面定义的通用节点的映射。我必须写这样的东西

List<Map<Long, Node<? extends MySuperClass>>> tree = new ArrayList<Map<Long, Node< extends MySuperClass>>>();

当我尝试将地图实例添加到列表中时

public MyClass extends MySuperClass{

}

    Map<Long, Node<MyClass>> myMap = new HashMap<Long,Node<MyClass>>();

    tree.add(myMap);

编译器给我以下信息:

 The method add(Map<Long,Node<? extends MySuperClass>>) in the type List<Map<Long,Node<? extends MySuperClass>>> is not applicable for the arguments (Map<Long,Node<MyClass>>)

语法上是正确的。我不明白为什么它不起作用。

【问题讨论】:

  • 我的错,答案已关闭,现在正在尝试思考..
  • 你能修复这条线Map&lt;Long, Node&lt;MyClass&gt;&gt; myMap = new ArrayList&lt;Long,Node&lt;MyClass&gt;&gt;吗?在那里写下你真正使用的东西。
  • @Tom 是的,这也困扰着我,但是如果他想使用 Map 中的方法(接口或类??)但他想要一个数组列表怎么办?
  • @AbdulAhmad 这一行甚至无法编译。如果他想要什么,那么他应该把它写在他的问题中,而不是在一些代码行上留下痕迹。顺便说一句:你不能混合数据类型(即在不相关的对象 B 上使用类 A 的方法)。
  • 是的,这段代码看起来并不准确。我的精简版编译得很好。初始化树的行在语法上不正确。 OP,你能把它改成一个不能编译的最小例子吗?

标签: java generics dictionary


【解决方案1】:

您的地图应该与您的列表定义相同的类型。

这是因为 List 需要 Map&lt;Long, Node&lt;? extends MySuperClass&gt;&gt; 类型。 Node&lt;? extends MySuperClass&gt;Node&lt;MyClass&gt; 的类型不一样。

来自http://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

注意:给定两个具体类型 A 和 B(例如,Number 和 整数),MyClass&lt;A&gt;MyClass&lt;B&gt; 无关,无论 A和B是否相关。 MyClass&lt;A&gt;的共同父母 而MyClass&lt;B&gt; 是对象。

注意:我添加了一个默认构造函数到你的 Node 类来编译接下来的四行,因为我不想为另一个构造函数输入参数。

List<Map<Long, Node<? extends MySuperClass>>> tree = new ArrayList<Map<Long, Node<? extends MySuperClass>>>();
Map<Long, Node<? extends MySuperClass>> myMap = new HashMap<Long, Node<? extends MySuperClass>>();
myMap.put(1L, new Node<MyClass>());
tree.add(myMap);

【讨论】:

  • OP 可能会被以下事实混淆:在他的例子中,A 和 B 之间的继承关系是由有界通配符而不是具体类型创建的(参见 docs.oracle.com/javase/tutorial/java/generics/subtyping.html)。尽管如此,关系是如何产生的并不重要——它仍然没有被考虑在内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2021-11-29
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多