Java 对Collections.sort()的正确强制转换是什么?

Java 对Collections.sort()的正确强制转换是什么?,java,Java,我有一个要排序的对象列表,但只有当列表的泛型类型符合java.util.Comparable时,才需要排序。我不确定正确的演员阵容是什么: private <T extends Widget> void doAction(Class<T> clazz, List<T> list) { if (Comparable.class.isAssignableFrom(clazz)) { Collections.sort(list); }

我有一个要排序的对象列表,但只有当列表的泛型类型符合
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.
}
还有别的,我只是在猜测。我以为第一个会奏效

感谢您的帮助

更新:要显示此操作如何不起作用,编译器会引发以下错误:

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>)
com/mycompany/test/widgetest.java:[112,20]找不到适合排序的方法(java.util.List)
方法java.util.Collections.sort(java.util.List,java.util.Comparatortry

private void doAction(类分类,列表){
if(可比类isAssignableFrom(clazz)){
集合。排序((列表)列表);
}
}

由于T被声明为extends小部件,您无法将列表强制转换为列表,因为它完全不兼容

我相信你可以做一个非常难看的角色,比如
(List)(List)List
,但它看起来太可怕了


我建议您制作一个虚拟的
Comparator
,它将输入对象强制转换为可比较的,并直接进行比较。这样您就可以简单地执行
集合.sort(list,new PassThroughComparator())

我刚刚在Eclipse中测试了你的代码,但没有收到任何错误消息。你到底有什么问题?@Sebastian-我已经添加了编译器消息。请注意,
小部件
不确认
可比性
,但是
框扩展小部件实现可比性
应该允许排序,这就是我正在尝试的实现。这是其中一种情况,在这种情况下,只需使用可比较的原始版本-
集合。排序(((列表)列表));
@Perception,看看它是如何工作的,转换为
(列表)
确实有效。@BrettRyan-现在这很有趣。因为a
ListNo go-
不可转换类型;必需:List,found:List,其中T是一个类型变量-T extends Widget
。这就是问题所在,请更新您的答案,以便我可以接受。值得的是,我在OS X上使用jdk1.7.0_15。
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>)
private <T extends Widget> void doAction(Class<T> clazz, List<T> list) {
    if (Comparable.class.isAssignableFrom(clazz)) {
        Collections.sort((List)list);
    }
}