今天我偶然發現了一些有趣的東西。 假設下面的Java 6類:覆蓋使用類型擦除的方法
public class Ereasure {
public Object get(Object o) {
return null; // dummy
}
public static class Derived<T> extends Ereasure{
// (1)
@Override
public Object get(T o) {
return super.get(o);
}
// (2)
/*
@Override
public Object get(Object o) {
return super.get(o);
}*/
}
}
如果你試圖編譯上面的例子中,編譯器說 Ereasure.java:9:方法不覆蓋或從超 實現的方法@Override 如果你刪除了@Override註解(這不應該是必要的!),它說 Ereasure.java:8:名稱衝突:Ereasure.Derived中的get(T)和Ereasure中的get(java.lang.Object)具有相同的擦除,但是兩者都不會覆蓋其他 這有點矛盾,因爲T應該複製到Object並因此覆蓋父類get方法。如果你離開(1)unannotated和取消註釋(2)so(1)重載(2)它也不起作用。 編譯器輸出:
Ereasure.java:15: get(T) is already defined in Ereasure.Derived
public Object get(Object o) {
作爲結論,T正在ereased反對意見,但不能覆蓋父get方法。
我現在的問題是,爲什麼dooesn至少有一個例子編譯?
@ toto2我認爲你的權利,但我也認爲它是一個有趣的看似無證的角落案件。根據Sun編譯器關於Type Erasure的說明,Derived中的方法定義應將Derived的get中的無界類型轉換爲public Object get(Object o),因爲它的父級的子簽名應該覆蓋它。我認爲他是正確的,當把這個東西變成字節碼來解決無界類型導致的方法調度模糊時,沒有辦法。 – nsfyn55