我正在使用 TreeSet 并在调用 ClassCastException 方法时发现了一个 TreeSet#add()

代码:

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 的元素进行排序)想要使用 ojit_code 定义的自然排序以外的排序)。

关于java - 为什么 TreeSet 声明为 TreeSet<E> 而不是 TreeSet<E extends Comparable<E>>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35770730/

10-12 22:34