2

我有一个我希望排序的对象列表,但前提是列表的泛型类型符合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需要类型参数来实现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);

还有其他的,我真的只是在猜测。我以为第一个会奏效。

任何帮助表示赞赏。

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

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可能符合的子类是我要测试的。

4

2 回答 2

2

尝试

private <T extends Widget> void doAction(Class<T> clazz, List<T> list) {
    if (Comparable.class.isAssignableFrom(clazz)) {
        Collections.sort((List)list);
    }
}
于 2013-03-26T03:26:35.470 回答
0

由于 T 被声明为 extends Widget,因此您不能将 List 转换为 List,因为它根本不兼容。

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

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

于 2013-03-26T03:56:25.850 回答