我有一个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>>)
从语法上讲,它是正确的。我无法理解为什么它不起作用。
答案 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);