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-现在这很有趣。因为aListNo 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);
}
}