Set具有相同的擦除,但都不会覆盖其他错误

时间:2017-11-07 01:11:59

标签: java collections compiler-errors set overloading

我的作业基本上是重写一组的方法,因此它可用于我创建的名为Square的自定义类。我一直收到错误:

error: name clash: removeAll(Collection<Square>) in SquareSet and removeAll(Collection<?>) in Set have the same erasure, yet neither overrides the other
public boolean removeAll(Collection<Square> objects) {

我在代码的开头导入了SetCollection,而SquareSet类实现了Set<Square>

    public boolean removeAll(Collection<Square> objects) {
    Square[] newSet;
    int count = 0;
    for(Square each : objects) {
        count -= 1;
        newSet = new Square[(daSet.length)-count];
        for (int i = 0; i < daSet.length; i++) {
            if (daSet[i].equals(each)) {
                if(i == 0) {
                    for (int j = 1; j < daSet.length ; j++) {
                        newSet[j - 1] = daSet[j];
                    }
                } else if (i == ((daSet.length) - 1)) {
                    for (int j = 0; j < daSet.length ; j++) {
                        newSet[j] = daSet[j];
                    }
                } else {
                    for (int j = 0; j < i; j++) {
                    newSet[j] = daSet[j];
                    }
                    for (int j = i; j < newSet.length; j++){
                    newSet[j] = daSet[j+1];
                    }
                }
            }
        }
    }

我知道当参数不同于参数类型I覆盖时,方法会被重载而不是被覆盖。但是我仍然不明白为什么我会收到这个错误。

1 个答案:

答案 0 :(得分:1)

由于您正在实施Set<Square>,您自然希望removeAll方法为removeAll(Collection<Square>),但不幸的是在Set界面中removeAll method is removeAll(Collection<?>),使用通配符而不是泛型类型参数。这会导致您的错误 - Collection<Square>Collection<?>不兼容。

至于为什么会这样,this question处理这个问题。基本上,当类似移除的方法完全通用时,设计师无法使其正常工作。

要正确实施界面,您必须将参数的类型设为Collection<?>。这意味着each的类型必须为Object,您必须对其进行输入 - 检查才能确定它是Square

此外,您需要更仔细地调整新阵列的大小,并且只有在您从阵列中删除匹配时才会这样。