[英]Type erasure unexpected behavior in Java
根據Java關於類型擦除和有界類型參數的文檔,我理解在下面的代碼示例中,兩個版本的doStuff()
將具有相同的擦除,因此將無法編譯。 我的目標是重載doStuff()
以接收ClassOne
和ClassTwo
。
import java.util.List;
class Example {
class ClassOne {
}
class ClassTwo {
}
public void doStuff(List<ClassOne> collection) {
}
public void doStuff(List<ClassTwo> collection) {
}
}
類型擦除的機制包括以下步驟:
·如果類型參數是無界的,則用泛型或對象替換泛型類型中的所有類型參數。 因此,生成的字節碼僅包含普通的類,接口和方法。
因此,我應該能夠應用一個綁定,然后它將編譯,因為現在類型擦除版本的doStuff重載了兩個不同的簽名(聲明的上限)。 例:
class Example {
class ClassOne {
}
class ClassTwo {
}
public <U extends ClassOne> void doStuff(List<U> collection) {
}
public <U extends ClassTwo> void doStuff(List<U> collection) {
}
}
第二個例子實際上沒有編譯並給出以下錯誤:
錯誤:(15,36)java:name clash:doStuff(java.util.List)和doStuff(java.util.List)具有相同的擦除
任何人都可以向我解釋這個嗎?
問題是List<U>
將在您的兩種方法中簡化為List
。 (擦除后不能List<ClassOne>
或List<Object>
。)
您引用的段落意味着可以擁有以下聲明:
class Example {
class ClassOne {
}
class ClassTwo {
}
public <U extends ClassOne> void doStuff(U foo) {
}
public <U extends ClassTwo> void doStuff(U foo) {
}
}
這里的泛型參數將分別由ClassOne
和ClassTwo
替換,這樣可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.