:
private static class Container
<Key extends Comparable<? super Key>, Value>
implements Comparable<Container<? super Key, ?>>
{
public Key key;
public Value value;
public Container(Key k, Value v) {
key = k;
value = v;
}
public int compareTo(Container<? super Key, ?> o) {
return key.compareTo(o.key);
}
}
...
이
는 오류입니다.
Container
을
Comparable<Pair<? super Key, Value>
을 구현하는 것으로 정의합니다. 즉, 메소드를 선언해야 함을 의미합니다.
public int compareTo(Comparable<Pair<? super Key, Value> o)
와일드 카드가 없기 때문에 지금은 그렇지 않습니다.
넓은 의미에서 문제는 와일드 카드 일치입니다. ?
은 "이 범위와 일치하는 모든 유형"을 의미합니다. 비판적으로 ?
의 다른 인스턴스는 다른 구체적인 유형이 될 수 있습니다; 이것은 "캡처"유형이 참조하는 것입니다.
물음표가 "쌍으로 표시"될 때마다 해당 매개 변수의 이름을 지정하여 ID를 적용 할 수 있습니다 (예 : 메소드의 일반 매개 변수 소개). ?
을 사용할 때마다 본질적으로 "나는 모두이 매개 변수의 구체적인 유형이 무엇인지 신경 쓰지 않습니다."라고 말하면서 정확히 일치하는 매개 변수에 의존하는 작업을 수행 할 수 없습니다 (예 : 할당).
편집 : 귀하의 의도가 약간 벗어난 것 같습니다. 특정 Key
유형의 Container
을 Key
의 다른 (수퍼 클래스) 컨테이너와 비교하여 선언하려고했습니다. 나는 이것이 반드시 비대칭을 가져 오기 때문에 반드시 좋은 생각이라고 확신하지는 않습니다.
예를 들어 Container<String>
을 Container<Object>
과 비교할 수 있도록하려고합니다. 하지만 다른 방법으로 라운드를 비교해도 을 컴파일하지 않았을 것입니다. 이 상황이 당신에게 유효한 것 같습니까? 비교 가능성이 대칭 적이라고 기대할 수 있으며 a.compareTo(b)
이 1이지만, b.compareTo(a)
은이 아니라 -1을 반환하지만 컴파일하는 것을 거부합니다. 이것이 Double이 예를 들어 Comparable<Double>
이고 Comparable<? super Double>
이 아닌 이유입니다.
평이한 대답은 EDIT : 임의의 개체와 비교할 수 없으므로 이러한 와일드 카드를 제거해야합니다. 당신이 Comparable
유형을 생성하지만 이해하지 않는 경우 어떤 이유
private static class Container
<Key extends Comparable<Key>, Value>
implements Comparable<Container<Key, ?>>
{
...
public int compareTo(Container<Key, ?> o) {
return key.compareTo(o.key);
}
}
좋아, 내가 그것을 이해하는 것 같아, 문제는 **? ** 같은 유형과 일치하지 않지만 여전히 모르겠다는 것입니다 그것을 해결하는 방법. 각 컨테이너 cl 호환 가능한 키 유형을 가진 다른 컨테이너와 비교할 수 있습니다. –