簡體   English   中英

我的方法簽名中這些東西叫什么? 泛型?

[英]What are these things in my method signature called? Generics?

我有一個方法簽名,可以按值對給定的映射進行排序。

public static <K extends Comparable<K>, V extends Comparable<V>> Map<K,V> sortByValues(Map<K,V> map){

我試圖了解此方法簽名中事物的術語。 我得到publicstaticMap<K,V> ,函數名稱和參數部分。

我的困惑是在<K extends Comparable<K>, V extends Comparable<V>>部分。 目的是定義方法上下文中的KV ,對嗎? 用什么恰當的術語來形容呢?

任何有關泛型的推薦讀物或文章?

是的,這里的KV是通用類型參數 更具體地說,正如@aruisdante在注釋中指出的那樣,它們是有界類型參數,因為它們指定了參數化類型必須滿足的界限-即它們都必須實現Comparable。

似乎您的問題是關於參數的,而不是關於有界參數的。 當您問到一個重要的(且很重要的)主題時 ,您絕對應該自己做一些閱讀,但是在介紹這個主題時 ,我會稍作努力:

您可能對在不同上下文中看到類型參數很熟悉-Map Map<String, Integer><String, Integer>此處也是類型參數,它們指定此映射中的鍵為String並且其中的值為Integer s。 在方法聲明的上下文中,類型參數指定返回類型是什么。 這意味着您可以編寫泛型方法 ,這些泛型方法每次調用時都會返回不同的類型,具體取決於您傳入的內容:

請注意, KV都是方法本身和傳入的參數上的類型參數:這告訴Java通過查看傳入的映射的鍵和值類型來確定KV ,並返回具有相同值的映射類型。 如果調用sortByValue(fooMap)並且fooMapMap<String, FooType> ,它將返回Map <String, FooType> ;如果fooMapMap<Integer, BarType>fooMap獲得Map<Integer, BarType>返回。

對於更清晰的示例,請考慮:

public <T> foobar(T t) {  }

這里的type參數是無界的-意味着T可以是任何類,因此您可以將任何類的對象作為參數傳遞,並獲得返回相同類型的對象。 要么

public<T> convertTo(Object o, Class<T> clazz) { } 

在這里,您可以傳入任何類的對象作為第一個參數,而作為第二個參數傳入確定TClass對象。 因此,您可以執行以下操作:

Fooclass s = convertTo(someObject, Fooclass.class) 

您可能會想到,這可能是非常有用的模式。

根據JLS第4章,它們是參數化類型的示例。 類型,值和變量部分說明:

具有一個或多個類型參數A1,...,An且具有對應范圍B1,...,Bn的泛型類或接口聲明C(第8.1.2節 ,第9.1.2節 )定義了一組參數化類型,一個對於類型參數部分的每個可能的調用。

集合中的每個參數化類型都具有C的形式,其中每個類型參數Ti覆蓋所有類型,這些類型是在相應邊界中列出的所有類型的子類型。 即,對於Bi中的每個結合類型Si,Ti是Si [F1:= T1,...,Fn:= Tn]的子類型。

...

給定類型聲明說明符,緊隨其后的是類型參數列表,令C為說明符中的最終標識符。

我看到泛型的方式與我看到類的方式相同,僅適用於類型和方法。 它們概括了方法和數據結構以本地支持所有有界類型。

而不是一遍又一遍地用相同的方法編碼相同的對象,而是說“好吧,不管您在< >告訴我什么類,我都會理解的”。

假設您要在未知對象數組中編寫二進制搜索...,您可以編寫以下簽名:

public boolean binarySearch(Object[] array)...

但是,如果您希望僅某些類型的數據(可相互比較的類型)可以訪問該方法,該怎么辦? 這是您將如何實現的方法:

public <T extends Comparable<T>> boolean binarySearch(T[] array)...

如下所示:“這是一個公共方法,它僅接收包含對象的數組(我們將它們稱為T),這些對象將Comparable接口實現為相同的類(T)。

不僅可以在泛型中擴展類,而且還可以擴展接口(就像上面的示例一樣)。

對於像這樣的數據結構

Vector<Integer> v;

這意味着Vector v將僅保存Integer對象,而不包含其他類型。

通配符在限制對象方面具有相同的原理,例如:

Vector<? extends Person> v;

該向量v將僅容納超類為Person的類。

這個

Vector<?> v;

大致相當於

Vector<Object> v;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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