簡體   English   中英

Java中具有類型擦除的重寫/重載方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM