为什么Java的TreeSet没有指定其类型参数必须扩展Comparable?

时间:2010-04-13 19:03:19

标签: java generics icomparable treeset

例如当第二个Object添加到TreeSet时,下面的代码抛出ClassCastException。无法编写TreeSet,因此type参数只能是Comparable类型? TreeSet无法编译,因为Object不是Comparable。通过这种方式,仿制药实际上可以完成它们的工作 - 类型安全。

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());
  }
}

4 个答案:

答案 0 :(得分:13)

TreeSet不要求其类型参数为Comparable,因为它可能需要外部Comparator来比较非Comparable值。

答案 1 :(得分:5)

如果类型必须是Comparable,则无法创建具有不可比类型和比较器的TreeSet(您现在可以使用它)。

在保持类型安全的同时修复此问题的一种方法是使用两个类:一个具有可比较的类型参数,一个具有不可比较的类型参数,并且没有默认构造函数(只有采用Comparator的构造函数) ,但我想java开发人员不想引入两个基本上做同样事情的类(尽管可以很容易地将其作为另一个包装器实现)。

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

答案 2 :(得分:1)

那是因为 not 的值必须实现Comparable。您可以显式传递集合Comparator对象,在这种情况下,元素类型不需要是Comparable

答案 3 :(得分:0)

您还可以使用TreeSet作为构造函数参数创建Comparator。那么你的物品就不一定具有可比性。