3

情况就是这样,我有两个类A,B和一个通用接口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> {...} 

然后,在其他班级,我得到了一个BList 并按如下方式排序

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不适用于 arguments (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> {...}

有谁能够帮我?

4

3 回答 3

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

通过定义一个ComparatorforC<A>如下:

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);
于 2012-11-12T05:27:13.133 回答
1

如果您希望C<T>根据其包含的类型进行一般可比较,则应使其自身可比较(C<T>, not 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);
    }
}

这仅对某些容器有意义,例如那些简单地包装一个值的容器。

于 2012-11-12T07:02:32.153 回答
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;
    }
});
于 2012-11-12T06:48:44.157 回答