2017-11-07 7 views
0

私の宿題は、基本的にセットのメソッドを書き直して、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) { 

私は私のコードとクラスSquareSet実装Set<Square>の先頭にSetCollectionの両方を輸入しました。

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]; 
        } 
       } 
      } 
     } 
    } 

パラメータが上書きされている場合、パラメータが上書きされる代わりに、メソッドがオーバーロードされるのではないことを理解しています。しかし、私はまだこのエラーが出ている理由を理解していません。

答えて

1

あなたがSet<Square>を実装しているので、あなたが自然にremoveAll(Collection<Square>)するremoveAll方法を期待したいが、残念ながらSetインタフェース、removeAll method is removeAll(Collection<?>)で、代わりに、ジェネリック型パラメータのワイルドカードを持ちます。これにより、エラーが発生します。Collection<Square>Collection<?>と互換性がありません。

なぜそれがそのようなのかについては、this questionがそれを扱います。基本的には、削除のような方法が完全に生成されたときには、デザイナーは適切に動作させることができませんでした。

インターフェイスを正しく実装するには、パラメータのタイプをCollection<?>にする必要があります。つまり、eachのタイプはObjectでなければならず、タイプチェックをしてSquareかどうかを確認する必要があります。

さらに、新しいアレイのサイズをさらに細かくしたい場合は、アレイからの削除に一致するものがある場合に限ります。

関連する問題