이유는 Set<Set<String>>
이 Set<HashSet<String>>
과 같지 않기 때문입니다! Set<Set<String>>
은 임의의 유형 Set<String>
을 포함 할 수 있으며, Set<HashSet<String>>
은 HashSet<String>
만 포함 할 수 있습니다.Set<Set<String>> set = new HashSet<HashSet<String>>()
법적 있었다
경우에는 오류없이이 작업을 수행 할 수 있습니다 :
Set<? extends Set<String>> set = setOfHashSets;
이 이제 때문에 허용된다 :
Set<HashSet<String>> setOfHashSets = new HashSet<HashSet<String>>();
Set<Set<String>> set = setOfHashSets;
set.add(new TreeSet<String>());
HashSet<String> wrong = set.iterator().next(); // ERROR!
그것은, 그러나, 법적 여기에 경계 와일드 카드를 사용하는 것입니다 , 집합에 포함 된 객체의 유형은 ? extends Set<String>
... 다른 말로하면 "알 수없는 클래스를 구현하는 Set<String>
클래스"입니다. Set<String>
의 특정 유형이 무엇을 포함하고 있는지 정확히 알지 못하므로 아무 것도 추가 할 수 없습니다 (null
제외) ... 잘못된 것일 수 있습니다. 나중에 내 오류가 발생합니다. 첫 번째 예.
편집 :
참고 귀하의 질문에 당신이 참조하는 "최상위 수준"제네릭 하나 이상의 유형 매개 변수을 유형을 의미 매개 변수 유형라는 것을. Set<Set<String>> set = new HashSet<Set<String>>()
이 합법적 인 이유는 HashSet<T>
이 Set<T>
을 구현하므로 하위 유형은 Set<T>
입니다. 그러나 형식 매개 변수 T
은 일치해야합니다. 유형이 S
이고 유형이 T
인 경우 HashSet<S>
(또는 Set<S>
even)은 Set<T>
의 하위 유형이 아닙니다! 위의 이유를 설명했습니다.
여기 정확히 상황입니다. 우리가 여기 T
와 Set<String>
를 교체 할 경우
Set<Set<String>> set = new HashSet<Set<String>>();
, 우리는 Set<T> set = new HashSet<T>()
를 얻을. 따라서 실제 유형 인수이 관련되어 있고 할당 오른쪽에있는 유형이 왼쪽에있는 유형의 부속 유형이라는 것을 쉽게 알 수 있습니다.
Set<Set<String>> set = new HashSet<HashSet<String>>();
는 여기에서 우리는 S
가 T
의 하위 유형입니다 각각 T
및 S
와 Set<String>
및 HashSet<String>
를 교체해야합니다. 완료되면 Set<T> set = new HashSet<S>()
이됩니다. 위에서 설명한대로 HashSet<S>
은 하위 유형이 Set<T>
이 아니므로 할당이 올바르지 않습니다.
이 대답은 나에게 많은 의미가 없습니다. John Kugelman과 ColinD는이 문제를 명확하게 설명합니다. – erickson
이것은 type 매개 변수를 "추론"하는 것과 아무런 관련이 없습니다. – ColinD
@ColinD : 수정하십시오. 결정된. – haylem