2016-07-30 26 views
2

我有這個簡單的節點:如何使用compareTo與節點?

public class Node<T> implements Comparable<Node>{ 
    T value; 
    Node<T> next; 
    public Node(T value){ 
     this.value = value; 
     this.next = null; 
    } 
    public int compareTo(Node other){ 
     return this.value.compareTo(other.value); 
    } 
} 

月食越來越聰明,要我投「THIS.VALUE」。使用int進行投射不起作用。應該怎麼做?

+0

要定義'compareTo'類型'T',其內部要調用'compareTo'上'this.value'其再次鍵入'T'。以這種方式來看待它:在你定義一個類型的'compareTo'之前,你怎樣才能在該類型上調用'compareTo'? – SomeDude

+0

不,我剛剛嘗試過,並沒有工作。 –

+0

但謝謝你試圖幫助。 –

回答

4

你對T的聲明並不「擴展」可比,所以你不能用它來比較。

你可以將其更改爲:

public class Node<T extends Comparable<T>> implements Comparable<Node<T>>{ 
    T value; 
    Node<T> next; 
    public Node(T value){ 
     this.value = value; 
     this.next = null; 
    } 
    public int compareTo(Node<T> other){ 
     return this.value.compareTo(other.value); 
    } 
} 

這假設是t實現媲美。否則,如果T沒有真正的可比性,那麼你可以在節點級進行比較。但是你應該還是宣告你的類像這樣

public class Node<T extends Something> 

讓你從Something方法做比較時一起工作。

如果我回到開頭:當你實例化您的節點,你做這樣的事情:

Node<MyType> node = new Node<MyType>(); 

的MyType成爲你的T.是MyType的可比的?如果是這樣,你可以像上面顯示的那樣聲明你的班級。否則,您將無法執行T.compareTo(aka MyType.compareTo),因此您需要使用MyType中的其他字段執行比較。

我希望這是不夠清楚..

+0

非常感謝你,它的工作完美。 –