2014-11-06 28 views
0

我有一個Node類:的Java創建普通的地圖對象

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

我不好,答案是一半,試圖現在想起來.. – 2014-11-06 15:14:41

+1

能否請您解決此行'地圖<龍,節點> MYMAP =新的ArrayList <龍,節點>'?寫下你真正在那裏使用的東西。 – Tom 2014-11-06 15:27:28

+0

@Tom是那也困擾着我,但是如果他想要使用來自Map(接口或類??)的方法,但他想要一個數組列表? – 2014-11-06 15:28:15

回答

2

你的地圖應該被定義類型相同的列表。

這是因爲列表需要一個類型的Map<Long, Node<? extends MySuperClass>>。類型Node<? extends MySuperClass>Node<MyClass>是不一樣的。

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

注:給定兩個具體類型A和B(例如,數量和 整數),MyClass<A>MyClass<B>沒有關係,不管 A和B是否有關係。 MyClass<A>MyClass<B>的共同父項是Object。

注意:我添加了一個默認的構造函數到你的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); 
+0

該死......慢。 – LostKatana 2014-11-06 15:35:40

+0

OP可以通過,在他的情況下,A和B之間的繼承關係由有界通配符,而不是具體的類型創建的事實被conofused(見http://docs.oracle.com/javase/tutorial/java/generics/ subtyping.html)。儘管如此,關係如何產生並不重要 - 它仍然沒有考慮到。 – Arkadiy 2014-11-06 15:52:03