我正在使用 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/