我正在使用TreeSet并在调用TreeSet#add()方法时发现了ClassCastException.
码:
public class Testing {
public static void main(String[] args) {
TreeSet<Testing> ts = new TreeSet<>();
ts.add(new Testing());
}
}
输出:
Exception in thread "main" java.lang.ClassCastException: Testing cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1290)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at Testing.main(Testing.java:13)
显然,这是因为TreeSet是一个有序集合,它需要Comparable对象来对它们进行排序,所以为什么不将它的类型声明为
public class TreeSet<E extends Comparable<E>>
并在编译期间进行检查而不是在运行时抛出异常?
解决方法:
TreeSet的元素不必实现Comparable,因为您可以将Comparator传递给TreeSet的构造函数之一,以便对不实现Comparable的元素(或者当您想要使用Comparable时实现Comparable的元素)进行排序.除了Comparable定义的自然排序之外的排序.