2012-08-15 25 views
1

如果我有以下方法:什麼是「?」的類型刪除?

public <U extends Number> void doSomething(List<U> l){  
} 

然後由於type erasure編譯器將使其對doSomething(List<Number> l)。對?
如果是這樣的話,那麼爲什麼它是不可能的聲明與此相伴如下:

public void doSomething(List<?> l){ 
} 

這不是第二個方法,type eraseddoSomething(List<Object> l)?爲什麼我會爲這兩種方法得到相同擦除的編譯器錯誤?

+0

你可以有實際的類型,周圍的工作:\t公共無效SETLIST(StringList的字符串){ \t} \t公共無效SETLIST(名單 OBS){ \t} \t private class StringList extends ArrayList { \t} – keuleJ 2012-08-15 15:39:22

回答

8

你的想法是錯誤的。擦除導致具有該簽名(List參數類型被擦除)這兩種方法:

public void doSomething(List l) { 
} 

因此,碰撞。你以爲是可能做到的是:

public <U extends Number> void doSomething(U argument) {  
} 
public <U extends Object> void doSomething(U argument) {  
} 

在這種情況下,刪除之後,該方法簽名將成爲本(U已經被擦除後)

public void doSomething(Number argument) {  
} 
public void doSomething(Object argument) {  
} 

在這種情況下,有沒有簽名衝突。

+0

因此'List'被保留並且列表中的類型參數被刪除? – Cratylus 2012-08-15 15:37:02

+1

@ user384706:準確地說。你可以用字節碼或反射來驗證它 – 2012-08-15 15:37:44

+0

我還沒有實現這個目標。你有參考我可以讀嗎? – Cratylus 2012-08-15 15:39:28

2

?在泛型中用作通配符。

它將被刪除。

U extends Number告訴上限是數

List<?>不知道什麼是上限。

編輯:基於編輯後的問題,編譯後,字節碼只包含。

public void doSomething(List argument) {  
} 
public void doSomething(List argument) {  
} 

Inheritance in generics與我們在java中繼承的知識有點不同。

+0

Ok.So?不是以某種方式擦除了嗎? – Cratylus 2012-08-15 15:28:50

+0

'U extends Number'並不意味着編譯器會將參數轉換爲'Number'? – Cratylus 2012-08-15 15:31:41

+0

這是正確的。 – kosa 2012-08-15 15:33:22

1

1.?被用作泛型中的通配符。

例如:

假設動物是一類

ArrayList<? extends Animal>裝置任何類的實例,其延伸動物

Erasure其是一種方法,其中編譯器在編譯時間去除泛型類和方法,以使泛型代碼兼容當泛型沒有被引入時寫的那個。

所以?U將在compilation時間內被刪除..所以運行期間,將缺席

+0

我不問什麼是'?'。我在問爲什麼這兩種方法的擦除類型相同 – Cratylus 2012-08-15 15:32:31

+0

請參閱我現在編輯的部分... – 2012-08-15 15:34:57