2012-11-12 27 views
3

下面的列表是這樣的,我有兩個班AB和通用接口C排序通用接口

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); 

這工作完全,但現在我想的B列表更改爲通用接口C,使其可以更加普遍。

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

這一次我得到了錯誤如下:

約束不匹配:Collections類型的通用方法sort(List<T>)不 適用於參數(List<C<A>>)。推斷類型C<A>不是爲界參數<T extends Comparable<? super T>>

我已經試過了如下修改(當然不工作)一 有效的替代品:

  1. 變化Cinterface C<T> extends Comparable<T>{...}
  2. 變化Bclass B extends A implements C<A>, Comparable<T> {...}

可以任何人他LP我?

回答

2

改變C到C接口擴展可比{...} B類延伸的工具13C {...}

正如你對錯誤信息已經看出,這些2韓元不會一起工作,因爲B的定義與Comparable<A>Comparable<C<A>>會有衝突。

由於A已經在實施Comparable<A>,可以通過定義一個ComparatorC<A>實現以下

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

如下:

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

,然後用該比較器將所述排序方法:

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

我明白了你的觀點。有用。謝謝。 – user1817188

1

由於C<A>不具有在A中定義的Comparator的可見性,因此它是抱怨。定義一個新的C<A>作爲比較器,它應該沒問題。

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>基於其包含的類型爲一般可比,你應該讓本身相當(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