1

我们在教程中制作了一个带有以下签名的示例(作为界面的一部分)

<T> List<Comparable<T>> sort(Collection<Comparable<T>> c, boolean ascending);

我们发现几乎不可能在没有警告的情况下实现该方法:

public <T> List<Comparable<T>> sort(Collection<Comparable<T>> c, boolean ascending) {
    List<T> list = new ArrayList<T>();
    Collections.sort(list);
    return list;
}

我们得到的行中的错误Collections.sort(list)是:

Bound mismatch: The generic method sort(List<T>) of type Collections is not 
applicable for the arguments (List<T>). The inferred type T is not a valid 
substitute for the bounded parameter <T extends Comparable<? super T>>

但是,它适用于以下签名:

<T extends Comparable<T>> List<T> sort(Collection<T> c, boolean ascending);

有了这个签名,上面的代码(的实现sort)就可以按预期工作。我想知道这是什么原因。

4

2 回答 2

3

s 的列表Comparable<T>是与 s 可比较的对象的列表T。不能说这些对象本身是否是Ts。因此,不可能将两个元素相互比较。

Ts,恰好与其他Ts 可比较,可以相互比较。因此,对此类Ts 的列表进行排序是可能的。

于 2012-10-17T10:05:34.707 回答
2

Collections.sort期望 a List<T extends Comparable<? super T>>,即编译器需要能够判断T它正在排序的列表的元素类型扩展Comparable<E>了 where Eis T、超类T或由 实现的接口T。您的第一个签名public <T> List<Comparable<T>> sort不会强制执行此操作,因此您不能Collections.sort使用List<T>. 你可以说

List<Comparable<T>> list = new ArrayList<Comparable<T>>();

匹配您的 sort 方法返回的类型,但问题是它相当不灵活 - 它只能对 a 进行排序Collection<Comparable<Foo>>而不能Collection<Bar>where进行排序Bar implements Comparable<Foo>。最灵活的方法是坚持使用,new ArrayList<T>()但使用类似的签名

<T extends Comparable<? super T>> List<T> sort(Collection<T> c, boolean ascending);

T这对使排序有效的最小限制- 它可以与Bar extends Foo implements Comparable<Foo>您的第二个签名不允许的(这将需要Bar implements Comparable<Bar>)一起使用。

于 2012-10-17T10:20:40.587 回答