2009-11-03 63 views
10

我感到困惑,當我遇到這類的一般方法。什麼是公共靜態<T>牛逼addAndReturn使用<T>(T元素,集合<T>集合){

public static <T> T addAndReturn(T element, Collection<T> collection){ 
    collection.add(element); 
    return element; 
} 

我不明白爲什麼<T>在此方法中是必需的。

此外,泛型方法和使用泛型語法的方法有什麼區別?

+0

請在提交問題前閱讀格式指南。他們很難錯過。 – Joe 2009-11-03 16:24:44

+1

嘗試將代碼示例格式化爲代碼 – NDM 2009-11-03 16:25:00

+0

@Joe,@Nicky De Maeyer:我修復了格式問題並刪除了PS。 – Asaph 2009-11-03 16:26:27

回答

4

替代方法是,使用對象而不是T,會導致函數返回對象。

當它返回T,你可以這樣做:

addAndReturn(myElement, col).SomeMethodOfMyElement(); 

如果addAndReturn返回的對象,而不是,你就必須爲使用

((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement(); 

這需要一個明確的轉換,或

addAndReturn(myElement, col); 
myElement.SomeMethodOfMyElement; 

需要兩條語句而不是一條語句。


編輯:現在你的問題已經被格式化,我看到的參數之一是Collection<T>。在這種情況下,通用語法確保:

addAndReturn(mySquare, collectionOfCircles); 

返回編譯時錯誤而不是運行時錯誤。


編輯:以防萬一你的問題是關於<T>語法,而不是關於使用一般的仿製藥組成:<T>告訴編譯器在方法定義中使用的T一些T類而是一個佔位符,用於任何適合於特定方法調用的類。

+1

感謝您的最近編輯評論。那是我的問題是關於。 我需要知道的是這個。 以下代碼片段對編譯器有什麼影響嗎?如果是這樣,怎麼樣? 1.公共靜態ŤaddAndReturn(集合集合){} 2.公共靜態ŤaddAndReturn(集合集合){} – 2009-11-04 06:40:46

+0

對不起。我這次也錯過了我的格式。 你能讓我知道如何格式化我的代碼? – 2009-11-04 06:41:33

+0

在第二個變體中,編譯器認爲您正在創建一個返回類T的函數,即文字「T」,如「class T {...}」中所示。在第一個變體中,您正在創建一個適用於* all *類的函數:如果您傳遞一個整數和一個集合,它將返回一個整數。 – Heinzi 2009-11-04 07:16:44

-1

這是一個泛型T只是返回的更具體類型的佔位符。在提供T的情況下,您是要添加到集合中的元素的類型。

Collection<int> intCollection = new Collection(); 
int addedInt = addAndReturn(5, intCollection); 
addedInt == 5; 

因爲都是T而不是T1或T2它們必須是作爲一個單一的類型顯然需要相同類型的對象,因爲函數增加了一個類型到一個通用的集合

+2

因爲這是java,我希望你的意思是集合 :) – penpen 2009-11-03 16:32:22

-1

T被用於多態的原因,如果我們可以這樣說。 T是任何類型的類。例如,如果你有一個Customer類,你可以使用上面提到的方法來處理你的用戶類型Customer類。 T允許你放置任何你想要的類型。

T將允許您爲您自己的用戶定義類型使用此泛型方法,就像它將爲值類型或任何其他類型使用一樣。 T成爲元素參數中指定的類型。

0

該方法返回相同的輸入element可能是因爲預期實施者使用Fluent Interface喜歡的方式提供一個更可讀的API:

addAndReturn(myElement, col).doElementStuff().doOtherElementStuff(); 

Here你對Java泛型,我覺得完全和啓發性的一個很好的教程。

8
> public static <T> T addAndReturn(T 
> element, Collection<T> collection){ 
>  collection.add(element); 
>  return element; } 

<T>(在尖括號)被稱爲一般類型參數,而直接T前述方法名是返回類型。你可能有一個泛型方法返回一些其他類型而不是泛型類型。也許你想要一個向元素添加一個元素的方法(所以類型爲T的對象),而不是返回添加的對象(它也是類型T),你希望它返回該元素的索引收集,這將永遠是一個整數。

其中返回類型不是一般類型實施例方法的簽名:

public static <T> Integer addAndReturn(T element, Collection<T> collection) 

通用方法,像任何其他方法,可以具有任何返回類型,包括通用類型本身,任何其他類型,任何基本或固有的數據類型,或無效。你可能會混淆方法簽名的兩個無關部分,認爲它們是依賴的,而當它們不是時。它們只是「從屬」的,因爲如果您使用,則使用T作爲返回類型,返回值的類型是您在呼叫站點提供的通用類型。