簡體   English   中英

何時使用 <T> 在泛型方法的聲明中

[英]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 (類型為TList<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.

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