2017-11-07 10 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]; 
        } 
       } 
      } 
     } 
    } 

나는 매개 변수가 내가 덮어 쓰기있어 매개 변수 유형에서 다른 경우 방법 대신 덮어 쓰기의 과부하 이해합니다. 그러나 나는 왜 나는이 오류가 발생하는지 이해하지 못합니다. 당신이 Set<Square>을 구현하고 있기 때문에

답변

1

, 당신은 자연스럽게 removeAll 방법은 removeAll(Collection<Square>) 것으로 예상 싶지만 불행하게도 와일드 카드 대신 제네릭 형식 매개 변수를 사용하여 Set 인터페이스는 removeAll method is removeAll(Collection<?>),있다. 이로 인해 Collection<Square>Collection<?>과 호환되지 않습니다.

왜 그런 식입니까? this question은 그 문제를 해결합니다. 기본적으로, 디자이너는 remove-like 메소드가 완전히 생성되었을 때 제대로 작동하지 않습니다.

인터페이스를 올바르게 구현하려면 매개 변수 유형을 Collection<?>이어야합니다. 즉, each의 유형은 Object이어야하며 입력 확인을 통해 Square인지 확인해야합니다.

또한 배열에서 제거 할 일치 항목이있는 경우에만 새 배열의 크기를 더욱 정교하게 조정해야합니다.