[英]When to use <T> in generic method's declaration
這有什么區別:
T getById(Integer id);
還有這個:
<T> T getById(Integer id);
他們不是都返回類型為T
的班級嗎?
在第一個片段中, T
指的是類'type參數列表中聲明的類型變量。
在第二個片段中,您將創建一個新的類型變量T
(可能會影響第一個類),在方法參數列表中聲明。
是的,但你必須在某處宣布T
你做了什么改變。
T
是在類級別定義的,因此您的方法是泛型類的一部分,並且在聲明/實例化時您必須專門化該類。 T
對於類中的所有方法和屬性都是相同的。 T
是在方法級別定義的,因此它是一個通用方法。 可以(通常)推導出T
值。 在第一種情況下, T
的范圍是整個類,而在第二種情況下,只是方法。
第二種形式通常與靜態方法一起使用。 此外,后者的優點是可以推導出類型變量T
(在大多數情況下你不必指定它),而你必須為前者指定它。
具體來說,如果它的某些屬性依賴於T
(類型為T
, List<T>
等),則必須使用泛型類。
第一個返回封閉泛型類型的類型T. 例如,
T get(int index);
在類中聲明List<T>
所述的給定索引處返回類型T的元素List<T>
第二個聲明方法本身是一個泛型方法,其返回類型取決於它被調用的方式。 如果你調用它
String s = theObject.<String>getById(id);
它將返回一個String。 如果你調用它
Foo f = theObject.<Foo>getById(id);
它將返回一個Foo。 大多數情況下,泛型類型是由編譯器自動推斷的,因此您可以簡單地編寫
Foo f = theObject.getById(id);
有關具體示例,請參閱
static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
它返回T的集合中T類型的最大元素。方法返回的類型取決於傳遞給方法的集合的類型。
其他答案在使用時解釋得很好,我提供了一個例子
對於第1點
class ArrayList<E> {//implementing and extending
public E get(int index) {
}
}
對於第2點:靜態實用方法
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.