2013-04-25 164 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