2013-08-31 36 views
3

我有兩個班,Foo和酒吧,與類型聲明:Foo <?>是否等同於非參數化的Foo?

class Foo<T> 
class Bar<Foo> 

這將導致一個編譯器警告,如酒吧foo的參數不paramaterised。理想情況下,我想避免編譯器警告,但我希望Bar接受任何Foo。所以我試過這個:

class Foo<T> 
class Bar<Foo<?>> 

這似乎工作正常,但我擔心可能有一個微妙的差異我失蹤。在那兒?

+2

聲明一個類爲'Bar >'是一個語法錯誤 - 也許你的意思是聲明一個*變量*爲'Bar >'。 –

回答

5

是的,有。考慮這個 -

List<?> myList; 

你不能把任何東西放到這個列表中,除了空。除了Object之外,您也無法從此列表中獲取任何內容。所以編譯器不會允許你通過添加不同類型的對象來破壞這個列表的類型不變性。如果你嘗試這樣做,你會得到一個編譯時錯誤。

但是如果你考慮以下列表(原始類型) -

List myList; 

然後你被允許把任何東西/從這裏得到什麼。所以人們可以通過放置不同類型的對象來輕易地破壞這個列表,並且在運行時您只能從ClassCastException中找到這個信息(如果您幸運的話....)。

因此,對於你的情況,用下面的辦法 -

class Foo<T> 
class Bar<Foo<?>> 

,如果你可以從第一個望而卻步。

欲瞭解更多信息,請Effective Java -

  1. 項目23 - 不要在新的代碼中使用的原始類型
  2. 項目26 - 青睞泛型類型
+0

啊,當然。不幸的是我想我在問錯誤的問題。可能很快就要問一個相當類似的問題:p – MikeFHay

1

Foo<?>在語義上與Foo<? extends Object>相同:它是一個Foo,其類型參數是特定的,但是on關於「某事」的已知事物是它是Object的一些子類(這不是說太多,因爲所有的類都是Object的子類)。

相關問題