2014-07-26 37 views
-3

我已經用一個類型變量創建了泛型類,它實現了java.lang.Comparable。我在如何實現compareTo()方法時遇到問題,因爲<>運算符不適用於泛型類型。我碰到這個對泛型的CompareTo方法的解釋

Create a compareTo to a Generic Class that Implements Comparable

來到遵循公認的答,我是能夠實現compareTo方法,但我不明白它是如何工作的,請任何人都可以解釋.... 答案我是指的是...

public class DoubleKey<K extends Comparable<K>, J extends Comparable<J>> 
     implements Comparable<DoubleKey<K, J>> { 

    private K key1; 
    private J key2; 

    public DoubleKey(K key1, J key2) { 
     this.key1 = key1; 
     this.key2 = key2; 
    } 

    public K getFirstKey() { 
     return this.key1; 
    } 

    public J getSecondKey() { 
     return this.key2; 
    } 

    public int compareTo(DoubleKey<K, J> that) { 

     int cmp = this.getFirstKey().compareTo(that.getFirstKey()); 
     if (cmp == 0) 
      cmp = this.getSecondKey().compareTo(that.getSecondKey()); 
     return cmp; 
    } 
} 
+1

請張貼一些代碼。 – OldCurmudgeon

+0

具體詢問你無法理解的內容! @ sky3287944! –

+0

@shekharsuman在接受的答案我不明白以下內容:可比較是一個接口,所以如何來兩個泛型類型擴展它...也在執行compareTo()方法爲什麼它遞歸自己... .... – sky3287944

回答

1

你所提到的答案代碼是正確的!

讓我詳細解釋你的代碼。首先,我們來檢查一下定義。

public class DoubleKey<K extends Comparable<K>, J extends Comparable<J>> 
implements Comparable<DoubleKey<K, J>> 

這是正確的,因爲可比本身是一個通用接口和Comparable正在DoubleKey Class實施。 要特別注意類型參數K和J被DoubleKey Class拋出然後傳遞給Comparable Interface的方式,這樣就可以聲明!我希望它清除你的第一個疑問!

接下來,你的第二個疑問是recursive call in compareTO() method!雖然它看起來似乎一見鍾情,但並不完全如此。仔細判斷你會發現它不會執行遞歸,因爲代碼不會因爲缺少Object而被調用。

爲了澄清更多的,

public int compareTo(DoubleKey<K, J> that) { 

    int cmp = this.getFirstKey().compareTo(that.getFirstKey()); 
    if (cmp == 0) 
     cmp = this.getSecondKey().compareTo(that.getSecondKey()); 
    return cmp; 
} 

它首先調用this(the current calling object),然後調用它getFirstKey(),然後調用標準可比接口的compareTo()方法。接下來,在外部compareTo()方法的內部定義中傳遞給compareTo()方法的參數的類型爲that.getgetSecondarykey()。它與外部compareTo()方法的類型參數不匹配,因爲外部compareTo()方法的參數類型爲DoubleKey,而內部compareTo ()方法有that.getSecondaryKey()類型的參數---指稱J.

所以,現在,很明顯,參數傳遞給外部和內部compareTo()方法differ.Inner的compareTo()是如在比較的接口中定義的標準compareTo(),這就是爲什麼作者已經實現了可比接口!

爲了更清楚,我簡化參數爲你的兩種方法: -

Outer compareTo()(DoubleKey<K,J> that) //parameter is of type DoubleKey<K,J> 
Inner first compareTo()(K key1)    //parameter of type K for first Inner method 
Innner second compareTo()(J key2)    //parameter of type J for second Inner method 

我希望這回答了你的所有doubts.Please評論,如果你不明白!此外,SORRY錯誤通知你那個時間。接受答案是該死的正確,並在我的答案是正當的!