2014-01-26 17 views
1

我正在嘗試學習genericsjava。我發現在課堂上,我們可以指定有界的類型參數爲class Stats <T extends Number>使用類級別,如通用有界類型參數,用於方法的形式參數

比方說,班裏有0​​類型的arrayaverage的方法來計算這些T's和其他方法的平均值,以檢查是否兩個對象的平均值是相同的或沒有。如果我想找到兩個對象的平均值是相同的或不
boolean isAverageSame(Stats<T extends Number> ob)

然而,在類中的方法水平,我不能做到這一點。

相反,我必須做的:
boolean isAverageSame(Stats<?> ob)

爲什麼會出現這種情況?這只是如何在java定義的語法或我錯過了什麼?

謝謝。

+0

「方法級別」是什麼意思?這是一種方法嗎?在課堂上呢? –

回答

3

這聽起來像你想聲明的方法一個新的通用參數,在這種情況下,你可以使用:

<U extends Number> boolean isAverageSame(Stats<U> ob) 

注意,這將允許你這樣做:

Stats<Integer> x = ...; 
Stats<Float> y = ...; 
boolean z = x.isAverageSame(y); 

這就是你想要的嗎?如果你只是希望能夠到Stats<Integer>Stats<Integer>(等)比較,那麼你只需要:

boolean isAverageSame(Stats<T> ob) 

...換句話說,該方法不會引入其他泛型類型參數。

+0

所以,它是語法的一部分。它對我來說看起來有點多餘。爲什麼我不能在參數本身中聲明?編輯: - 是的,我希望該方法適用於數字的子類型的所有對象。 –

+2

@JakeFoster:方法的一部分是聲明類型參數,另一部分是聲明參數的類型*。有些情況下,這些不會是相同的。例如,假設你想用'T extends Number'聲明一個類型參數,並且用一個類型參數爲'?'的'List'來聲明。延伸T'。或者你可能想在兩個不同的參數中使用type參數,這也會很尷尬 - 你會在哪裏放置約束?把兩者分開對我來說很有意義。 –

+0

謝謝,這是有道理的。 –

相關問題