[英]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){
我試圖了解此方法簽名中事物的術語。 我得到public
, static
, Map<K,V>
,函數名稱和參數部分。
我的困惑是在<K extends Comparable<K>, V extends Comparable<V>>
部分。 目的是定義方法上下文中的K
和V
,對嗎? 用什么恰當的術語來形容呢?
任何有關泛型的推薦讀物或文章?
是的,這里的K
和V
是通用類型參數 。 更具體地說,正如@aruisdante在注釋中指出的那樣,它們是有界類型參數,因為它們指定了參數化類型必須滿足的界限-即它們都必須實現Comparable。
似乎您的問題是關於參數的,而不是關於有界參數的。 當您問到一個重要的(且很重要的)主題時 ,您絕對應該自己做一些閱讀,但是在介紹這個主題時 ,我會稍作努力:
您可能對在不同上下文中看到類型參數很熟悉-Map Map<String, Integer>
: <String, Integer>
此處也是類型參數,它們指定此映射中的鍵為String
並且其中的值為Integer
s。 在方法聲明的上下文中,類型參數指定返回類型是什么。 這意味着您可以編寫泛型方法 ,這些泛型方法每次調用時都會返回不同的類型,具體取決於您傳入的內容:
請注意, K
和V
都是方法本身和傳入的參數上的類型參數:這告訴Java通過查看傳入的映射的鍵和值類型來確定K
和V
,並返回具有相同值的映射類型。 如果調用sortByValue(fooMap)
並且fooMap
是Map<String, FooType>
,它將返回Map <String, FooType>
;如果fooMap
是Map<Integer, BarType>
, fooMap
獲得Map<Integer, BarType>
返回。
對於更清晰的示例,請考慮:
public <T> foobar(T t) { }
這里的type參數是無界的-意味着T
可以是任何類,因此您可以將任何類的對象作為參數傳遞,並獲得返回相同類型的對象。 要么
public<T> convertTo(Object o, Class<T> clazz) { }
在這里,您可以傳入任何類的對象作為第一個參數,而作為第二個參數傳入確定T
的Class
對象。 因此,您可以執行以下操作:
Fooclass s = convertTo(someObject, Fooclass.class)
您可能會想到,這可能是非常有用的模式。
我看到泛型的方式與我看到類的方式相同,僅適用於類型和方法。 它們概括了方法和數據結構以本地支持所有有界類型。
而不是一遍又一遍地用相同的方法編碼相同的對象,而是說“好吧,不管您在< >
告訴我什么類,我都會理解的”。
假設您要在未知對象數組中編寫二進制搜索...,您可以編寫以下簽名:
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.