为什么TreeSet声明TreeSet <E>而不是TreeSet <E extends Comparable <E >>

Cod*_*der 3 java generics treeset

我正在使用TreeSet并找到了一个ClassCastExceptionwhile调用TreeSet#add()方法.

码:

public class Testing {
    public static void main(String[] args) {
        TreeSet<Testing> ts = new TreeSet<>();
        ts.add(new Testing());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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)
Run Code Online (Sandbox Code Playgroud)

显然,这是因为它TreeSet是一个有序的集合,它需要Comparable对象来订购它们,所以为什么不将它的类型声明为

public class TreeSet<E extends Comparable<E>>
Run Code Online (Sandbox Code Playgroud)

并在编译期间进行检查而不是在运行时抛出异常?

Era*_*ran 7

一个TreeSet元素不必实现Comparable,因为你可以传递Comparator给一个TreeSet构造函数,以便为不实现的元素强加一个排序Comparable(或者Comparable当你想要使用其他元素时实现的元素的排序)比自然定义的Comparable).

  • 我想我没有通过整个API文件就问得太快了...谢谢...... :) (2认同)