2013-07-22 37 views
1

我知道Interface Comparable<T>中有一種方法,那就是compareTo()。我假設它只是一個沒有任何實現的函數名稱,當任何類實現Comparable接口時,該類必須覆蓋該方法。但後來我讀了Docs爲什麼compareTo()有它自己的實現主體,而Comparable是一個接口?

並發現Comparable也返回一個值int,並且具有它自己的實現,而不需要在實現類中重寫它。

例如,下面的例子:

public static <T extends Comparable<T>> T max(T a, T b) { 
    if (a == null) { 
     if (b == null) return a; 
     else return b; 
    } 
    if (b == null) 
     return a; 
    return **a.compareTo(b)** > 0 ? a : b; 
} 
+3

這是因爲你正在使用「Comparable」對象引用,而不是「compareTo」方法(可能你認爲你在做)。 「 –

+3

」可以作爲一種常規方法「?你能否將這句話改爲更有意義?老實說,我不明白你在問什麼。 –

+1

Docs只是聲明'compareTo'應該返回什麼(它的*合約*)。爲什麼你認爲它意味着它在界面中有一個實際的實現? –

回答

1

Comparable是一個接口,意思是實現它的對象必須實現它的方法。你是對的,它只有一個方法來實現compareTo(T o)。你也正確的方法返回一個整數。由於此對象小於,等於或大於指定對象,因此compareTo將返回負整數,零或正整數。

這樣的接口存在的原因是使java更通用。由於接口定義了比較的標準名稱和基礎,因此此標準可用於其他方法,如Collections.sort或Collections.binarySearch。這樣,如果您想對剛在Vector中創建的500個對象進行排序,您只需實現compareTo(T o),然後就可以調用Collections.sort(myVector)。

我覺得你對某些對象已經實現了接口Comparable(如Integer,String,UUID或CharBuffer)的事實感到困惑。這些將會「開箱即用」,但是如果您嘗試將JPanel的向量(一個沒有實現Comparable的類)傳遞給Collections.sort,您將會遇到錯誤。

4

有沒有這樣的「落實」在你提供的方法 - 該方法僅僅是一個呼叫者的compareTo。類型T extends Comparable<T>意味着實施Comparable<T>的一些變量類型T

例如,Integer實現Comparable<Integer>,所以你可以撥打:

Integer i = max(123, 42); 

String實現Comparable<String>,所以你也可以撥打:

String s = max("asdf", "blah"); 

這是一個通用電源的方法 - 其身體可以在各種類型上重用。在這種情況下,該方法在其類型變量T上具有上限Comparable<T>,以保證它可以在T的實例上調用compareTo

例如,這不能編譯,因爲Object沒有實現Comparable<Object>

// Object is the common supertype of Integer and String 
Object o = max(42, "asdf"); 
0

它沒有它自己的實現。它只是聲明一個像接口那樣的操作。在您的示例中,您正在調用a上的操作compareTo(),該類型爲Comparable。這是可能的,因爲Comparable聲明操作。

但是Comparable只是該變量的所謂的靜態類型。在運行時它有一個動態類型。這意味着它指向的對象是Comparable(實現它)的子類型,因此也必須實現compareTo。因爲您無法創建接口類型的對象,所以指向a的對象不能直接指向Comparable類型。

在我看來,你應該閱讀面向對象,子類型和多態性。詳細解釋將是對這個網站緩行。

相關問題