[英]Java Generics method structure explanation
我試圖學習java泛型,從這里我得到了下面的方法定義,可以有人解釋為什么我們在返回類型之前聲明<T extends Comparable<T>>
。
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem)
我知道Comparable接口的用法,但是為什么我們需要在方法的返回類型之前使用此<T extends Comparable<T>>
?
相反,我們可以像寫public static int countGreaterThan(T[] anArray, T elem)
,它也將采用通用參數
所以我的問題是,為什么我們需要<T extends Comparable<T>>
或只是一個<T>
?
這僅表示通用類型T
必須擴展Comparable<T>
。 通過告訴編譯器,您的T
對象將可以使用Comparable<T>
所有公共方法。
Comparable<T>
是一個接口,其協定表示“我們可以將此對象與T類型之一進行比較”。 如果對象本身的類型為T,則該對象與其自身具有可比性。 這是我們在這里想要的行為。 類似的行為的例子是Integer
,它實現Comparable<Integer>
。
在此,此方法要求您傳入與自己可比較的對象。
如果這些對象的類型為T,則它們必須實現Comparable<T>
以便彼此比較。 由於泛型擴展/實現約束在所有情況下都使用關鍵字extends
,因此泛型聲明為T extends Comparable<T>
。
該方法需要一個項目數組和一個項目,並且從名稱來看,我猜想它將返回anArray
中“大於” elem
。
這將適用於具有明確的“大於”關系的任何類型T
,即,任何與自身Comparable
類型,正是<T extends Comparable<T>>
表示的形式-任何類型T
,只要該類型是將目標類型本身作為其類型參數的Comparable
的實現。
它限制T必須是實現Comparable的類,以便T的一個實例可以與T的另一個實例進行比較
countGreaterThan方法是一種通用方法,需要將一個對象與該類型的另一個對象進行比較。 CompareTo(Comparable接口的)方法為實現Comparable接口的類型提供一種比較該類型的兩個對象的方式。
由於countGreaterThan方法使用compareTo方法,因此要求提供給該方法的參數具有實現Comparable接口的那些類型。
當您聲明一個有界的類型參數時,您將告訴編譯器T是實現Comparable接口的類型。 因此,在類型T的對象上調用compareTo方法是安全的。因此,將有界類型聲明為>可使您在類型T的對象上調用compareTo方法。現在,編譯器將讓您在對象上調用compareTo方法。通用類型。 不僅如此,編譯器還將強制要求提供給方法countGreaterThan的參數類型實現Comparable接口。
T表示任何類型。 所以如果你有方法
public static int countGreaterThan(T[] anArray, T elem)
這意味着您可以這樣稱呼它:
public static int countGreaterThan(String[] anArray, String elem)
或任何其他班級。 您在這里的唯一約束是T表示的兩個類是相同的。
>表示T必須是Comparable的子類。 因此,T需要實現可比性。 一個示例是Integer,它實現Comparable。 這意味着,Integer具有方法Integer.compareTo(Integer i)。
如果要使用該接口定義的某些方法,>約束可能很有用。 對於您的方法countGreaterThan():此方法需要使用.compareTo()來確定一個輸入對象是否大於另一個對象,因此每個輸入對象都需要具有.compareTo()方法。 因此,您聲明>,現在可以使用.compareTo()。
由於這是靜態函數,因此必須附帶有關T的信息。 對於實例方法,T將已經被定義/約束。 即:
class Example<T extends Comparable<T>> {
public void doSomethingWithT(T param) { ... };
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.