2013-04-25 162 views
4

我想创建一个使用泛型打字的二叉树,我有一个错误,我不明白。我尝试了两种编码方式,第二种方式工作。我不明白为什么第一次失败。Java - 泛型类型

我有以下共同代码:

public class MyTreea <T extends Comparable<T>> 
{  
    class BT_Node<T extends Comparable<T>> 
      { 
      T   value; 
      BT_Node<T> left; 
      BT_Node<T> right; 

      BT_Node(T node_value) 
        { 
        this.value = node_value ; 
        left   = null; 
        right  = null; 
        } 
      }   

所不同的是在插入过程: 这工作:

private BT_Node<T> insert(BT_Node<T> node, BT_Node<T> newNode) { 
     if ((node.value).compareTo(newNode.value) == 0) { . . . } 

但这种失败

private BT_Node insert(BT_Node node, T value) { 
     if (value.compareTo(node.value) == 0) { . . 

有了:

MyTreea.java:28: error: method compareTo in interface Comparable<T#2> cannot be applied to given types; 
      if (value.compareTo(node.value) == 0) 
required: T#1 
found: Comparable 
reason: actual argument Comparable cannot be converted to T#1 by method invocation conversion 
where T#1,T#2 are type-variables: 
T#1 extends Comparable<T#1> declared in class MyTreea 
T#2 extends Object declared in interface Comparable 

显然,如果我叫BT_insert具有两个节点的参数是那朵罚款。 (并且我通过创建一个额外的函数来满足这个需求),但我宁愿不这样做。

谢谢

+0

你可能发布完整的文件,包括命名空间和Comparable类吗? – likeitlikeit 2013-04-25 08:59:52

回答

1

BT_Node可以使用T而无需再次参数化,删除它的T参数。

否则你必须在不同的TS可能是其可比的不同扩展。 也没有BT_Node<T>

3

您应该能够使用具有以下特征的第二个例子:

private BT_Node<T> insert(BT_Node<T> node, T value) 

你给的例子使用了“原始类型”(即没有泛型参数的通用类),通常总是不好的想法,可以说只是为了向后兼容Java 1.4。 BT_Node是一个通用类,所以你应该总是给它一个通用的参数。

在没有的情况下,这大致相当于传入BT_Node<?>,因为该节点可能具有其通用参数的任何值。因此,编译器不能保证value你传递了​​正确的类型 - 第一个参数可以是例如BT_Node<Int>,而TString

通过在泛型参数传递为T,编译器可以检查value的类型和节点的类型做比赛。

+0

嗨, 感谢您的支持。 它工作完美。 – user2318773 2013-04-27 01:54:27