2010-07-02 5 views
5

나는 litte 문제점을 가지고 있으며이를 해결하는 방법이 궁금합니다. 나는 제네릭 클래스 Tuple<A,B>이 지금은 그것과 같아야 A와 B에 따라 자신의 튜플을 정렬 싶습니다오브젝트가 Comparable을 구현하는지 확인하십시오.

정렬되지 않은 :

 
(1,5) 
(2,8) 
(6,8) 
(1,4) 
(2,4) 

결과 순위 :

 
(1,4) 
(1,5) 
(2,4) 
(2,8) 
(6,8) 

들어 그 이유는 Tuple 클래스에서 제네릭 비교 메서드 (public int compareTo(Tuple<A, B> other))를 구현할 생각이었습니다. 유일한 문제는 클래스를 매개 변수화 할 수있는 모든 객체 (예 : A = Integer, B = String)는이 모든 작업을 수행하기 위해 compareTo 메소드도 구현해야한다는 것입니다.

Tuple이 보유 할 수있는 모든 객체가 Comparable 인터페이스를 구현할 수있는 방법이 있습니까?

이 문제를 해결하는 방법에 대한 다른 제안 사항이 있습니까?

감사합니다.

답변

5

튜플 (튜플 < 정수, 문자열 >).

+0

'A extends Comparable '을 선호하지만, 튜플 자체에 대해 Comparable을 구현하려면 +1을 선호합니다. 나는 그것을 기억해야만했다. –

+0

아, 고마워. 오해하지 않도록 내 대답을 편집했으며 mmyers 버전을 upvoted했습니다. – Lyle

1

트릭을 수행해야합니다. 지정한 모든 클래스는 Comparable을 확장해야합니다. 당신이

public class Tuple<A extends Comparable<? super A>, 
        B extends Comparable<? super B>> { ... 

로 클래스를 선언하면

public class Tuple<? extends Comparable> { 
} 
+0

Tuple의 원래 일반 선언을 보지 않고이 코드를 작성 했으므로 A와 B 매개 변수가 누락 된 것에 대해 책임을 질 수는 없습니다. 그러나 Comparable을 매개 변수 화하지 않았기 때문에 경고가 표시됩니다. –

7

는 그 A와 B 모두 자기 비교할 보장합니다. 그런 다음 클래스에있는 유형 A 또는 B의 모든 오브젝트에서 compareTo()으로 호출 할 수 있습니다.

public class Tuple<A extends Comparable<? super A>, B extends Comparable<? super A>> implements Comparable<Tuple<A, B>> { 
    A valueA; 
    B valueB; 

    @Override 
    public int compareTo(Tuple<A, B> tuple) { 
     // Implement comparison logic 
     return 0; 
    } 
} 

이 당신의 구성 요소에 대한 다른 유형을 지정할 수 있습니다 : 당신은 튜플의 구성 요소가과 같이, Comparable를 확장하도록 지정합니다 (항목을 또한 Effective Java의 27 참조) 재귀 형의 경계를 사용할 수

관련 문제