簡體   English   中英

Java泛型方法結構說明

[英]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的實現。

能夠訪問: compareTo(T o); 我們必須擴展Comparable接口

為什么,因為只有在執行此操作后,我們才能訪問它,因為它事先無法使用。

在此處輸入圖片說明

Wikipedia上有一篇關於Java泛型的出色文章

它限制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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM