java – 为什么TreeSet声明TreeSet而不是TreeSet>

我正在使用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定义的自然排序之外的排序.

上一篇:set 集合


下一篇:java Set接口实现TreeSet