JAVA 8 - 在使用泛型的用户定义 class 中实现 Comparable - Collections.sort() 不起作用

JAVA 8 - Implementing Comparable in a user-defined class that uses generics - Collections.sort() not working

我有一个用户定义的 class,它应该是通用的,可以接受整数、浮点数、双精度数等,但也需要能够进行比较。看起来像:

public class MyClass<T extends Comparable<T>> implements Comparable<MyClass<T>>{
private T myClassObject;
...

compareTo 方法看起来像

@Override
public int compareTo(MyClass<T> o){
    return this.myClassObject.compareTo((T) o));
}

现在在稍后的 class 中应该创建 MyClass 对象的 ArrayList 并比较它们,我得到:

sort(java.util.List<T>)' in 'java.util.Collections' cannot be applied to '(java.util.ArrayList<MyClass<?>>)

包含这些 MyClass 对象的 ArrayList 如下所示:

ArrayList<MyClass<?>> temp = new ArrayList<MyClass<?>>();

是否因为通配符泛型使用而失败?我需要指定吗?扩展数字或其他?

通用 Collections.sort 方法中 List<T> 参数中的 T 强制您传入一个列表,其中包含可以相互比较的元素。

一个List<MyClass<?>>可以有相互之间不可比较的元素。

使用 List<MyClass<?>>,您可以将 MyClass<String> MyClass<Integer> 放入同一个列表中!

ArrayList<MyClass<?>> temp = new ArrayList<MyClass<?>>();
temp.add(new MyClass<>(1));
temp.add(new MyClass<>("String"));

要对这个列表进行排序,Collections.sort 必须知道如何比较 MyClass<Integer>MyClass<String>!那是胡说八道。更重要的是,Comparable<T>不支持这个操作。

List.sort - 一种非泛型方法 - 另一方面,没有这种“平等约束”,并且会进行一堆不安全的强制转换,如果您尝试,将在运行时抛出异常用不同类型的 MyClass.

对列表进行排序

虽然与错误无关,但请注意,您 Comparable 实施错误。应该是:

return myClassObject.compareTo(o.myClassObject);