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>) 具有相同的擦除,但都不覆盖另一个

我在这里缺少什么?

回答

如果您的代码编译,那么你可以上溯造型的一个实例SubClassBaseClass,然后通过一些其他种类的CharSequenceStringtransform方法。

这显示了它如何破坏类型安全:

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()));


以上是Java类型擦除:为什么以下代码段不能编译?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>