2015-07-01 31 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