2012-06-07 2 views
2

나는이 컴파일 할 때 :호환되지 않는 유형 - SortedSet의 및 TreeSet의

import java.util.*; 

public class NameIndex 
{ 
    private SortedMap<String,SortedSet<Integer>> table; 

    public NameIndex() 
    { 
     this.table = new TreeMap<String,TreeSet<Integer>>(); 
    } 
} 

내가 얻을 :

Incompatible types - found java.util.TreeMap<java.lang.String,java.util.TreeSet<java.lang.Integer>> but expected java.util.String,java.util.SortedSet<java.lang.Integer>> 

어떤 생각을 왜?

는 UPDATE : 이 컴파일 :

public class NameIndex 
{ 
    private SortedMap<String,TreeSet<Integer>> table; 

    public NameIndex() 
    { 
     this.table = new TreeMap<String,TreeSet<Integer>>(); 
    } 
} 
+0

가능한 중복'목록 '목록 '의 서브 클래스 '? 왜 Java의 제네릭은 암시 적으로 다형성이 아닙니까?] (http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicit) – assylias

+0

예 - 복용 이 질문을 보면 나는 동의한다고 생각한다. 내 이해는이 질문을 읽는 것에서 하나의 일반 인터페이스를 인터페이스로 사용할 수없고 다른 일반을 구체적인 클래스로 사용할 수 없다는 점입니다. 그들은 동일해야합니다. – Snowcrash

답변

2

이 시도 : 당신이 그것에 요소를 추가 할 때

this.table = new TreeMap<String, SortedSet<Integer>>(); 

당신은지도에있는 값의 실제 유형을 지정할 수 있습니다, 그 사이에 당신에게 속성을 선언 할 때 사용한 것과 동일한 유형 (즉, StringSortedSet<Integer>)을 사용해야합니다. 지도에 새로운 키/값 쌍을 추가 할 때

예를 들어,이 작동합니다

table.put("key", new TreeSet<Integer>()); 
1

항상 대신 구체적인 유형의 인터페이스 객체를 입력합니다. 따라서 귀하는 지금 가지고있는 것이 아니라

private Map<String, Set<Integer>> table; 

대신에 다음을 가져야합니다. 장점은 현재 원할 때마다 구현을 전환 할 수 있다는 것입니다. 그런 다음

:

this.table = new TreeMap<String, Set<Integer>>(); 

SortedSetTreeSet는 다른 유형이기 때문에 그들이 동일한 인터페이스 (Set)를 구현하지만 당신은 컴파일시 오류가 발생합니다.

private SortedMap<String, ? extends SortedSet<Integer>> table; 

하지만 난 사용하는 것이 좋습니다 :

+0

SortedSet은 내가 테이블 선언에 사용한 인터페이스입니다. 그런 다음 구체적인 유형 (예 : TreeSet)을 사용하여 구현할 것으로 예상됩니다. 그러나 그것은 컴파일되지 않았습니다. 그래서 구체적인 유형 (즉 TreeSet)을 두 번 지정해야했습니다. 어느 것이 나를 혼란스럽게하는지. – Snowcrash

+0

컴파일 타임 오류로 인해 외부 형식이 아닌 제네릭이 발생했습니다. 'TreeMap'은'SortedMap'의 유효한 하위 타입 (구현)입니다. – CheeseWarlock

+0

@CheeseWarlock 당신 말이 맞아요. 나는지도와 세트를 섞었다. 고정. –

1

당신은 항상 선언 할 수 있습니다

private Map<String, ? extends Set<Integer>> table; // or without '? extends' 

봐 질문 this에서

[인가의
+0

나는'? 'SortedSet '을 확장한다. 왜냐하면 원래의 표기법에서 내부 집합은 단지 하나의 집합이 아닌'TreeSet '이기 때문이다. –

+0

'SortedSet'과'Set'은 둘 다 인터페이스라고 생각합니다. extends SortedSet' 나는 프로그래밍이 인터페이스가 아니라 구현이 아닌 원칙을 훼손하지 않을 것이라고 생각합니다. 게다가'SortedSet'의 계약은'Set'의 계약과 다르며 공용 인터페이스에서 사용할 수있는 몇 가지 추가 메소드가 간단한'Set'에서 제공되지 않습니다. –

+0

@edalorzo 전적으로 동의합니다. 선언에'SortedSet'을 제공하는 것은 나중에이 필드를 어떻게 사용할 것인지에 달려 있습니다. – Xeon

관련 문제