排序通用接口列表

时间:2012-11-12 04:25:56

标签: java generics sorting collections interface

就是这种情况,我有两个类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);

这次我得到的错误如下:

  

绑定不匹配:类型sort(List<T>)的通用方法Collections不是   适用于参数(List<C<A>>)。推断类型C<A>不是   有效替代有界参数<T extends Comparable<? super T>>

我尝试了以下修改(当然不起作用):

  1. C更改为interface C<T> extends Comparable<T>{...}
  2. B更改为class B extends A implements C<A>, Comparable<T> {...}
  3. 有人能帮助我吗?

3 个答案:

答案 0 :(得分:2)

  

将C更改为接口C扩展Comparable {...}   B类扩展A实现C {...}

正如您从错误消息中已经看到的那样,这两个不会一起工作,因为B的定义与Comparable<A>Comparable<C<A>>之间存在冲突。

由于A已在实施Comparable<A>,您可以实现以下

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

Comparator定义C<A>,如下所示:

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

然后使用此比较器应用sort方法:

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

答案 1 :(得分:1)

由于C<A>没有Comparator中定义的A的可见性,因此它正在抱怨。定义一个新的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;
    }
});

答案 2 :(得分: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);
    }
}

这仅适用于某些容器,例如那些只包装值的容器。