我有一个我希望排序的对象列表,但前提是列表的泛型类型符合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
的子类可能符合我正在尝试测试的内容。
答案 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());