2012-11-12 2 views
3

의 목록이 나는 그런 다음 두 개의 클래스 A, BC정렬 일반적인 인터페이스 여기

Class A implements Comparable<A> {...} 

interface C<T> {...} 

//this class is not longer generic type, I do not know if this matter. 
Class B extends A implements C<A> {...} 

일반적인 인터페이스를 가지고,의 경우, 다른 클래스에, 나는 B 목록을 가지고 및 후속으로 분류

List<B> list = new ArrayList<B>(); 
Collections.sort(list); 

이 완벽하게 작동하지만, 지금은 좀 더 일반적인 될 수 있도록, 일반 인터페이스 CB의 목록을 변경하고 싶습니다.

List<C<A>> list = new ArrayList<C<A>>(); 
Collections.sort(list); 

나는 다음과 같은 오류가있어이 시간 :

바운드 불일치 : 유형 Collections의 일반적인 방법 sort(List<T>)는 인수 (List<C<A>>) 적용되지 입니다.

  1. 변화 C
  2. interface C<T> extends Comparable<T>{...}로 변경 B : 유추 유형 C<A>는 (물론이 작동하지 않습니다의) 나는 다음과 같은 수정을 시도 <T extends Comparable<? super T>>

바운딩 매개 변수에 대한 유효한 대체하지 않습니다 ~ class B extends A implements C<A>, Comparable<T> {...}

나?

답변

2

변경 C, 당신은 이미 오류 메시지에서 보았을 것으로 클래스 B가 구현 된 C {...}

를 확장 {...} C가 Comparable를 확장 이러한 이원 인터페이스하기 B의 정의가 Comparable<A>Comparable<C<A>> 인 경우 충돌이 발생하므로 함께 작업하지 마십시오. 이 비교기 정렬 방법을 적용 후

class CTComparator<T> implements Comparator<C<T>> 
{ 
    @Override 
    public int compare(C<T> o1, C<T> o2) 
    { 
     return 0; 
    } 
} 

하고 : A 이후

이미 Comparable<A> 구현되고, 다음과 같이 C<A>하는 Comparator 정의하여 다음

List<C<A>> list = new ArrayList<C<A>>(); 
Collections.sort(list); 

를 얻을 수

List<C<T>> list = new ArrayList<C<T>>(); 
Collections.sort(list, comparator); 
+0

나는 당신의 요점을 얻었다. 그것은 작동합니다. 감사. – user1817188

1

C<A>Comparator의 가시성을 가지고 있지 않으므로 A에 정의되어 있으므로 불평하고 있습니다. C<A>의 새 비교기를 불어서 정의하면 괜찮을 것입니다.당신이 C<T>이 포함 된 유형에 따라 일반적으로 비교 될 것으로 기대하는 경우

List<C<A>> list = new ArrayList<C<A>>(); 
Collections.sort(list, new Comparator<C<A>>() { 
    @Override 
    public int compare(C<A> o1, C<A> o2) { 
     //implement the comarison 
     return 0; 
    } 
}); 
1

, 당신은 (C<T>하지 T) 자체가 비교 만들지 만, Comparable을 구현하는 것과 그 값 유형을 결합해야한다. 다음과 같은 것 :

public class C<T extends Comparable<? super T>> extends Comparable<C<T>> { 
    private final T value; 

    @Override 
    public int compareTo(C<T> that) { 
     return this.value.compareTo(that.value); 
    } 
} 

이것은 단순히 값을 감싸는 컨테이너와 같은 일부 컨테이너에만 적용됩니다.

+0

이 제안 또한 도움이됩니다. 감사. – user1817188