[英]overriding / overloading methods with type erasure in java
給定2類:
public class A{
public <T> Cell<T> f(Cell<T> l){
return null;
}
}
public class B extends A{
public <T> Cell<T> f(Cell<Cell<T>> l){ // trying to override
return null;
}
}
(當Cell是某個通用類時)。
我知道類型擦除后,類看起來像:
public class A{
public Cell f(Cell l){
return null;
}
}
public class B extends A{
public Cell f(Cell l){ // trying to override
return null;
}
}
在我知道類型擦除之前,我認為我確實理解了為什么編譯器將其視為重載。
但是現在我(認為)我知道類型擦除,這兩個方法簽名是相同的,而且我真的認為編譯器將其視為覆蓋更為有意義。
編譯之后,得到了Java的編譯器將其視為OVERLOAD的嘗試,而不是覆蓋,並因重載到相同簽名的方法而產生錯誤。
我的問題 :盡管類型擦除之后,簽名仍然相同,但為什么編譯器仍將其視為重載而不是重載?
謝謝!
錯誤“具有相同簽名的重載”在這里似乎足夠。 從技術上講,這不是最重要的,因為對於編譯器泛型而言很重要,並且B的f不滿足A的簽名,因為A的f T不限於實現Cell<?>
因此B的f不會取代A的f。 取而代之的是將其稱為“重載”,因為從通用角度來看,盡管在擦除后最終相同,但這些簽名卻是不同的。
我認為,針對這種特殊情況使用泛型添加了“具有相同簽名的重載”錯誤,導致擦除沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.