在 java 中使用类型擦除覆盖/重载方法

overriding / overloading methods with type erasure in java

与给定的 2 classes:

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 是一些通用的 class)。

我知道在类型擦除之后,classes 看起来像:

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;
    }
}

在我知道类型擦除之前,我认为我确实理解为什么编译器将其视为重载。

但现在我(认为)我知道类型擦除,这两个方法签名是相同的,我真的认为编译器将其视为 OVERRIDING 更有意义。

编译后,发现 java 的编译器将其视为试图重载而不是覆盖,并在重载到相同签名的方法时产生错误。

我的问题: 为什么编译器仍然将此视为 OVERLOADING 而不是 OVERRIDING 的尝试,尽管在类型擦除之后签名是一样的?

谢谢!

这里的错误 "overloading with same signature" 似乎足够了。它在技术上不是压倒一切的,因为对编译器来说,泛型很重要,B 的 f 不满足 A 的签名,因为 A 的 f T 不限于实现 Cell<?>,所以 B 的 f 不会压倒 A 的 f;将其称为 "overloading" 更有意义,因为从通用角度来看,这些签名是不同的,尽管在擦除后最终是相同的。

我认为 "overloading with same signature" 错误是针对此特定场景添加的,泛型导致擦除冲突。