Java创建通用对象的地图

时间:2014-11-06 15:08:57

标签: java generics dictionary

我有一个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>>)

从语法上讲,它是正确的。我无法理解为什么它不起作用。

1 个答案:

答案 0 :(得分:2)

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

这是因为List需要一种Map<Long, Node<? extends MySuperClass>>类型。类型Node<? extends MySuperClass>Node<MyClass>不一样。

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

  

注意:给定两种具体类型A和B(例如,Number和   整数),MyClass<A>MyClass<B>无关,无论如何   A和B是否相关。 MyClass<A>的共同父母   并且MyClass<B>是对象。

注意:我添加了一个默认构造函数给你的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);