2015-07-01 73 views
0

我想實現一個通用的二叉樹。下面是節點類的聲明java:綁定時使用泛型不匹配

public abstract class Node<E extends Comparable<E>> { 
} 

一個具體的節點:

public class BinaryTreeNode extends Node<BinaryTreeNode> implements 
     Comparable<BinaryTreeNode> { 

    @Override 
    public int compareTo(final BinaryTreeNode node) { 
     if (this == node) { 
      return 0; 
     } 
     return this.getValue().compareTo(node.getValue()); 
    } 
} 

抽象的樹類

public abstract class BinaryTree<T extends Node<T>> { 

    /** 
    * TODO. 
    */ 
    public BinaryTree() { 

    } 

    /** 
    * TODO. 
    * 
    * @param node TODO 
    */ 
    public abstract void addNode(final T node); 

    /** 
    * TODO. 
    * 
    * @param node TODO 
    */ 
    public abstract void removeNode(final T node); 

} 

這是因爲T參數在那裏我得到的約束不匹配,的節點。我曾嘗試將它擴展爲Comparable,但我不能將其應用於工作。我該如何申報?我想讓二叉樹能夠與擴展Node的所有類一起工作。

這裏有一個具體的樹:

public class ConcreteBinaryTree extends BinaryTree { 

    private Node root; 

    @Override 
    public void addNode(Node node) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void removeNode(Node node) { 
     // TODO Auto-generated method stub 

    } 

} 

如何,我需要在這裏添加類型參數?

回答

5

BinaryTree類需要聲明TComparable太 - 你可以使用一個類型路口:

public static abstract class BinaryTree<T extends Node<T> & Comparable<T>> 

而且你ConcreteBinaryTree類看起來是這樣的:

public class ConcreteBinaryTree extends BinaryTree<BinaryTreeNode> { 
    @Override 
    public void addNode(BinaryTreeNode node) { } 
    @Override 
    public void removeNode(BinaryTreeNode node) { } 
} 
+0

感謝回覆!出於好奇:如果沒有類型交叉點,它也是可能的嗎? – user3629892

+0

你可以有兩個類型參數'BinaryTree ,N extends Node >'但這會更加冗長,強制調用者在聲明BinaryTree時總是明確地放置這兩個類型參數......我可以'沒想到其他選擇,但可能會有一些。 – assylias

+0

好的,非常感謝! – user3629892