Collections.sort()的正确转换是什么?

时间:2013-03-26 01:43:02

标签: java

我有一个我希望排序的对象列表,但前提是列表的泛型类型符合java.util.Comparable。我不确定正确的演员阵容是什么:

private <T extends Widget> void doAction(Class<T> clazz, List<T> list) {
    if (Comparable.class.isAssignableFrom(clazz)) {
        Collections.sort(list);
    }
    // Do more.
}

Collections.sort需要使用type参数来实现java.util.Comparable,所以我尝试了以下所有功能都不起作用:

Collections.sort((List<? extends Comparable<T>>)list);
Collections.sort((List<? extends Comparable>)list);
Collections.sort((List<? extends Comparable<? super T>>)list);
Collections.sort((List<T extends Comparable<? super T>>)list);

还有别的,我真的只是在猜测。我认为第一个会奏效。

感谢任何帮助。

UPDATE :为了说明这不起作用,编译器会引发以下错误:

com/mycompany/test/WidgetTest.java:[112,20] no suitable method found for sort(java.util.List<T>)
    method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable
      (cannot instantiate from arguments because actual and formal argument lists differ in length)
    method java.util.Collections.<T>sort(java.util.List<T>) is not applicable
      (inferred type does not conform to declared bound(s)
        inferred: T
        bound(s): java.lang.Comparable<? super T>)

请注意,Widget不符合Comparable,这是预期的,但Widget的子类可能符合我正在尝试测试的内容。

2 个答案:

答案 0 :(得分:2)

private <T extends Widget> void doAction(Class<T> clazz, List<T> list) {
    if (Comparable.class.isAssignableFrom(clazz)) {
        Collections.sort((List)list);
    }
}

答案 1 :(得分:0)

由于T被声明为extends Widget,因此它无法将List转换为List,因为它只是不兼容。

我相信你可以像(List<Comparable>)(List)list那样做一个非常丑陋的演员,但它看起来很可怕。

我建议你制作一个虚拟Comparator,它会将输入对象强制转换为Comparable并直接进行比较。这样你就可以做Collections.sort(list, new PassThroughComparator());