Java

时间:2019-01-30 15:55:12

标签: java generics override overloading type-erasure

具有给定的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(而不是覆盖)的尝试,并且在重载到相同签名的方法时产生错误。

我的问题: 为什么在类型擦除后,尽管签名完全相同,编译器仍将其视为重载而不是重载?

谢谢!

1 个答案:

答案 0 :(得分:0)

此处出现错误“使用相同签名重载”似乎足够。从技术上讲,这不是最重要的,因为对于编译器泛型而言很重要,并且B的f不满足A的签名,因为A的f T不限于实现Cell<?>,因此B的f不会取代A的f;取而代之的是将其称为“重载”,因为从通用角度来看,尽管在擦除后最终相同,但这些签名却是不同的。

我认为在这种特殊情况下使用泛型会导致“擦除相同签名”错误,这会导致擦除冲突。