문제

지 않는 이유는 무엇 컬렉션입니다.제거(Object o) 일반?

Collection<E>boolean remove(E o);

그런 다음 경우를 제거하려고(예를 들어) Set<String> 대신은 각각의 문자열에서 Collection<String>, 그것을 컴파일에 오류가 대신의 문제를 디버깅니다.

도움이 되었습니까?

해결책

조 블라 및 빌 퓨를 참고 이 문제에 Java 얼 IV:이 팬텀 참조 위협,공격의 복제 또는 복수의 이동.

조 블 말한다(6:41)는 그들을 시도했 generify get 메서드 의 지도,제거 방법이고 다른 하지만"그것은 단순히 작동하지 않았다".

너무 많은 합리적인 프로그램할 수 없는 경우 generified 당신이만 허용은 일반적인 유형의 컬렉션으로 매개 변수는 유형입니다.예를 그에게 주어진 교차하는 지점의 ListNumbers 고 ListLongs.

다른 팁

remove() (에 Map 뿐만 아니라에서 Collection)일반은 하기 때문에 당신을 통과 할 수 있어야에서 모든 유형의 객체 remove().개체의 제거되어야 하지 않는 동일한 유형으로 개체에 전달하기 remove();그것은 단지 요구는 그들이 동일하다.사양 remove(), remove(o) 객체를 제거합 e(o==null ? e==null : o.equals(e))true.참고는 아무것도 요구하는 oe 을 동일한 유형이 있습니다.이에서 다음과 같다는 사실 equals() 메서드에서 Object 으로 매개 변수는,단지와 같은 형식 개체입니다.

지만,그것은 수 일반적으로 사실 많은 클래스 equals() 그래서 정의는 해당 개체할 수 있는 것만 같은 개체는 자신의 클래스,그것은 확실히지 않는 경우가 있습니다.예를 들어,사양 List.equals() 는 것을 말한 두 개의 목록을 개체가 동일한 경우 그들은 모두를 나열하고 동일한 내용이 경우에도,그들은 다른 구현 List.그래서 돌아 오는 예제에서,이 질문에 그것이 가능한가 Map<ArrayList, Something> 고 나를 위해 통화 remove()LinkedList 으로 인수,그리고 제거하는 키가 목록으로 같은 내용입니다.이것이 가능하지 않는 경우 remove() 었 일반적이고 제한된 인수 유형입니다.

기 때문에 당신의 유형 매개 변수는 와일드카드를 사용할 수 없습니다 일반을 제거 방법입니다.

나는 것을 기억으로 달리 이 질문으로도의 get(Object)방법입니다.Get 메서드 이 경우에 없는 일반적인,하지만 그것은 합리적인 기대를 전달할 객체와 같은 형식의 첫 번째 유형 매개 변수입니다.는 것을 깨달았을 경우 당신은 주위에 지나가지도와 함께 와일드카드로 첫 번째 유형 매개변수,그 다음 방법은 없을 얻는 요소를 지도와 함께하는 방법은 경우,인수는 일반적입니다.와일드카드를 인수 할 수 없습니다 정말 만족하기 때문에,컴파일러를 보장할 수 없는 형식은 올바른 것입니다.나는 추측하는 이유는 추가 일반적인은 당신이 예상하는 것을 보장하는 형식을 올바른 추가하기 전에 그것을의 컬렉션입니다.그러나 제거할 때는 객체는 경우,형식이 잘못된 그것은 일치하지 않습니다 어쨌든 아무것도.는 경우 인수했다는 와일드카드는 방법은 단순히 사용할 수 없더라도 당신이 있는 객체을 보장할 수 있습니다 그리고 그 컬렉션이기 때문에,당신은 그것을 참조하 이전입니다.

아마 설명하지 않았다 아주 좋은,하지만 이것이 충분하다.

이외에 다른 답변,거기에 또 다른 이유는 방법을 받아들일 Object, 는 조건자.다음 샘플을 참고하십시오:

class Person {
    public String name;
    // override equals()
}
class Employee extends Person {
    public String company;
    // override equals()
}
class Developer extends Employee {
    public int yearsOfExperience;
    // override equals()
}

class Test {
    public static void main(String[] args) {
        Collection<? extends Person> people = new ArrayList<Employee>();
        // ...

        // to remove the first employee with a specific name:
        people.remove(new Person(someName1));

        // to remove the first developer that matches some criteria:
        people.remove(new Developer(someName2, someCompany, 10));

        // to remove the first employee who is either
        // a developer or an employee of someCompany:
        people.remove(new Object() {
            public boolean equals(Object employee) {
                return employee instanceof Developer
                    || ((Employee) employee).company.equals(someCompany);
        }});
    }
}

요점은 그 개체에 전달되는 remove 는 방법에 대한 책임을 정의하는 equals 방법입니다.건축 조건자가 이 방법입니다.

가정 하나의 컬렉션 Cat, 며,일부 객체 참조의 유형 Animal, Cat, SiameseCat, 고 Dog.요청의 컬렉션을 포함하는지 여부 개체라고도 불 CatSiameseCat 참조 보이 합리적이다.묻는지 여부 개체를 포함하고 Animal 참조 보일 수 있습 닷지만,그것은 여전히 완벽하게 적당합니다.체에서 질문할 수 있습한 후,모든 수 Cat, 고에 표시될 수 있습니다.

또한,는 경우에도 개체 발생 이외의 다른 Cat, 아무런 문제가 없는지 여부를 말하는 그것에 나타나 컬렉션--단순히 대답이"그렇지 않아요".는"조회 스타일"컬렉션의 일부 입력할 수 있어야 합하여 의미 있게 받아들의 참조 모든 상위 유형 및 여부를 결정체 내에 존재하 컬렉션입니다.는 경우 전달된 객체 참조은 관련이 없는 형식,방법은 없 컬렉션할 수 있다,그래서 쿼리가 어떤 의미에서 의미가 없습니다(그 대답은"no").그럼에도 불구하고 있기 때문에,어떤 방법을 제한하는 매개변수는 하위 또는퍼,그리고 가장 실용적이 단순히 받아들일 모든 종류와"아니오"라고 대답에 대한 어떠한 물체의 형식과 관련이 없는 것의 컬렉션입니다.

나는 항상 생각이었기 때문에 제거()할 이유가 없 케어는 개체의 유형은 당신이 그것을 줄.그것은 쉽게 충분한 관계없이,을 확인하는 경우에는 개체의 하나의 컬렉션을 포함 할 수 있기 때문에,전화 equals()에 아무것도.그것은 확인 하는 데 필요한 유형에 추가한다()하는지 확인만의 개체를 포함하는 유형입니다.

을 제거하지 않은 일반적인 방법 그래서는 기존의 코드를 사용하여 일반적인 컬렉션은 컴파일하고 아직도 동일한 동작이다.

http://www.ibm.com/developerworks/java/library/j-jtp01255.html 자세한 내용은.

편집:주석유를 묻는 추가 방법은 일반적입니다.[...제거 나 설명...]두 번째 의견 제시 질문에 대답에서 firebird84 많은 나보다 낫다.

또 다른 이유가 이 때문에 인터페이스가 있습니다.다음은 예시:

public interface A {}

public interface B {}

public class MyClass implements A, B {}

public static void main(String[] args) {
   Collection<A> collection = new ArrayList<>();
   MyClass item = new MyClass();
   collection.add(item);  // works fine
   B b = item; // valid
   collection.remove(b); /* It works because the remove method accepts an Object. If it was generic, this would not work */
}

기 때문에 그것은 기존(pre-Java5)코드입니다.예를 들어,

Set stringSet = new HashSet();
// do some stuff...
Object o = "foobar";
stringSet.remove(o);

지금 당신은 말할 수 있는 위의 코드의 잘못된다는 것을,그러나 가정 o 에서 온 다른 유형의 집합체(즉,그것은 포함된 문자열 숫자,사물,etc.).을 제거하려는 모든 일치하는 법률이었기 때문에 제거하는 것 그냥 무시 비 문자열이었기 때문에 비 같습니다.그러나 만약 당신이 그것을 제거하(String o),는 더 이상 작동하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top