Java类型擦除:为什么以下代码段不能编译?
我目前正在准备我的 Java SE 11 开发人员证书,我似乎无法理解类型擦除的概念。我有以下课程:
public class BaseClass {
public List<? extends CharSequence> transform(Set<? extends CharSequence> set) {
return null;
}
}
public class SubClass extends BaseClass {
@Override
public List<String> transform(Set<String> set) {
return null;
}
}
据我了解,类型擦除会将方法签名变成以下内容:
public List<? extends CharSequence> transform(Set set) {
return null;
}
public List<String> transform(Set set) {
return null;
}
对我来说,这似乎是一个有效的覆盖。但是,当我编译程序时,出现以下错误:
名称冲突: covariant.car.SubClass 中的 transform(java.util.Set<java.lang.String>) 和 covariant.car.BaseClass 中的 transform(java.util.Set<? extends java.lang.CharSequence>) 具有相同的擦除,但都不覆盖另一个
我在这里缺少什么?
回答
如果您的代码编译,那么你可以上溯造型的一个实例SubClass来BaseClass,然后通过一些其他种类的CharSequence比String对transform方法。
这显示了它如何破坏类型安全:
class NotString implements CharSequence {
public char charAt(int index) {
return 'A';
}
public int length() {
return 1;
}
public CharSequence subSequence(int start, int end) {
return this;
}
public String toString() {
return "A";
}
}
BaseClass base = new SubClass();
// Oops, passing Set<NotString> to transform(Set<String> set).
base.transform(Set.of(new NotString()));