为什么Java';s TreeSet未指定其类型参数必须扩展为Comparable?

为什么Java';s TreeSet未指定其类型参数必须扩展为Comparable?,java,generics,icomparable,treeset,Java,Generics,Icomparable,Treeset,e、 当第二个对象被添加到TreeSet时,下面的代码抛出一个ClassCastException。树集的编写不能使类型参数只能是可比较的类型吗?i、 e.树集不会编译,因为对象不可比较。这样,泛型实际上完成了它们的工作——类型安全 import java.util.TreeSet; public class TreeSetTest { public static void main(String [] args) { TreeSet<Object> t = new Tre

e、 当第二个对象被添加到TreeSet时,下面的代码抛出一个ClassCastException。树集的编写不能使类型参数只能是可比较的类型吗?i、 e.树集不会编译,因为对象不可比较。这样,泛型实际上完成了它们的工作——类型安全

import java.util.TreeSet;
public class TreeSetTest {
  public static void main(String [] args) {
   TreeSet<Object> t = new TreeSet<Object>();
   t.add(new Object());
   t.add(new Object());
  }
}
import java.util.TreeSet;
公共类树集{
公共静态void main(字符串[]args){
树集=新树集();
t、 添加(新对象());
t、 添加(新对象());
}
}

树集
不要求其类型参数为
可比
,因为它可以使用外部
比较器
来比较不可比的值。

如果类型必须是可比的,则无法创建具有不可比类型和比较器的树集(你可以保持现状)

在仍然是类型安全的情况下解决这个问题的一种方法是使用两个类:一个具有可比较的类型参数,另一个具有不可比较的类型参数,并且没有默认构造函数(只有使用比较器的构造函数),但我想java开发人员不想引入两个基本上做相同事情的类(尽管其中一个可以很容易地实现为另一个的包装器)


另一种(可以说是更简洁的方法)是扩展类型系统,使某些构造函数仅在与某些类型参数一起使用时才存在(即,只有当类型参数具有可比性时,默认构造函数才存在),但我认为这会使通用系统对java过于复杂。

这是因为该值不一定要实现
Comparable
。您可以显式地将集合传递给
Comparator
对象,在这种情况下,元素类型不需要是
Comparable
,您还可以创建e> TreeSet带有一个
比较器
作为构造函数参数。那么您的项目就不必具有可比性。

啊,谢谢。我想没有办法指定对无参数构造函数的限制,使其只能采用可比性?如果有两个类(一个采用可比类型参数a)会更好吗第二个可以使用任何类型参数,但其构造函数必须使用比较器?@Tarski:
TreeSet
是在1.2中添加的。泛型是在1.5中添加的。感谢全面的回答。哈哈,我认为泛型系统已经够复杂了!