2015-04-20 32 views
7

我有一種方法,我想接受必須擴展抽象類的類類型。是什麼Java泛型 - 方法簽名的上限

<T extends AbstractClass> void myMethod(Class<T> clazz);

void myMethod(Class<? extends AbstractClass> clazz);之間的區別?

我不能在第二種情況下直接引用方法中的類型。這兩種方法可以傳遞哪種類型有什麼區別?

+2

@prudhvi,''是一個(有界)的類型參數,使得泛型方法的整體聲明成爲可能。這與作爲泛型類的方法不同。 –

+0

@JohnBollinger我認爲它應該是 myMethod(Class clazz); 或 void myMethod(Class clazz); 我對不對? – Prudhvi

+1

*「我是對嗎?」*不,你不是。類型參數不會替換返回類型。 – Tom

回答

5

不,與您提供的兩個方法簽名兼容的參數類型之間沒有區別。就個人而言,如果我需要引用參數表示的確切類型,我會使用參數化版本,但除此之外,我會使用通配符版本。

2

在第一個1,你也將能夠返回T(或任何類型的參數與T:列表<牛逼>,設置<牛逼> ...等),而無需將其丟

<T extends AbstractClass> T myMethod(Class<T> clazz); 

而且使用它作爲:

Subclass parameterInstance =... 
Subclass i1 = myMethod(parameterInstance.getClass()); 
1

這個問題已經被問過很多地方,特別是herehere

這兩個問題主要涉及無界通配符和泛型類型,但這裏適用相同的原則。我還建議閱讀其中一個答案(爲方便起見,放置here)提供的其中一個鏈接(Angelika Langer - Java泛型常見問題解答)。

雖然在你的具體情況中沒有區別,但差異只是簡單介紹瞭如何在內部(在方法內)處理類型數據。去看似最能描述你的目的的東西吧。如果您正在處理未知類型的數據,並且您需要特定的輸入類型在該方法中特別可用,那麼您需要採用泛型方法。另一方面,如果您不能也可以將所有輸入數據視爲邊界類型(例如AbstractClass),則可以使用有界通配符方法。