我的作业基本上是重写一组的方法,因此它可用于我创建的名为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) {
我在代码的开头导入了Set
和Collection
,而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覆盖时,方法会被重载而不是被覆盖。但是我仍然不明白为什么我会收到这个错误。
答案 0 :(得分:1)
由于您正在实施Set<Square>
,您自然希望removeAll
方法为removeAll(Collection<Square>)
,但不幸的是在Set
界面中removeAll
method is removeAll(Collection<?>)
,使用通配符而不是泛型类型参数。这会导致您的错误 - Collection<Square>
与Collection<?>
不兼容。
至于为什么会这样,this question处理这个问题。基本上,当类似移除的方法完全通用时,设计师无法使其正常工作。
要正确实施界面,您必须将参数的类型设为Collection<?>
。这意味着each
的类型必须为Object
,您必须对其进行输入 - 检查才能确定它是Square
。
此外,您需要更仔细地调整新阵列的大小,并且只有在您从阵列中删除匹配时才会这样。