2013-12-20 53 views
6

我有一個方法,這樣,在方法的返回類型中,<T> T與T之間有什麼區別?

public <T> T doSomething(Class<T> T) { 
return T.newInstance(); 
} 

我也可以這樣做一樣,

public T doSomething(Class<T> T) { 
return T.newInstance(); 
} 

有這兩者之間有什麼區別?請忽略T.newInstance(),我基本上會創建一個T的新實例並返回它。

感謝, SAM

回答

3

在第一個例子,你聲明泛型方法doSomething有自己的類型參數<T>。如果它在通用類中,那麼這個<T>與該類可能具有的任何類型參數(甚至另一個<T>!)是分開的。

在第二個示例中,您沒有在doSomething上聲明泛型類型參數。如果這個類定義了<T>,那麼這個方法簡單地使用它。如果沒有,則T無法識別,並且會導致編譯器錯誤。

8

<T> T vs T在方法的返回類型中有什麼區別?

沒有<T> T<T>不是返回類型的一部分;它是一個單獨的東西,指示類型參數。 (您也可以public <T> void ...)。

在版本<T>,你聲明T作爲方法的類型參數,在參數中T和返回類型指的是該類型參數。

在版本沒有<T>,你聲明T作爲方法的類型參數,所以它是最有可能包含類的類型參數或其他含有範圍。 (或者,某人可能已經命名了實際的班級或接口T,在這種情況下,您應該爲該人講話。)

如果兩個版本都編譯,那麼第二個可能是您想要的那個:您可能想要要使用類的參數T,而不是添加一個隱藏它的新類。 (如果你真的想要一個與你的類的類型參數無關的新類型參數,那麼你應該使用一個新的名字來避免混淆。)

+0

'class T { T T(T T){return T; }}' – ZhongYu

+0

@ zhong.j.yu你的觀點? – EJP

0

第二個選項只有在T被聲明爲類的泛型類型。如果類沒有定義任何泛型類型,並且只有其成員函數接受/返回泛型類型,則需要在函數聲明中顯式聲明它。

相關問題