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);
我有一个用户定义的 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);