使用非Comparable类创建TreeSet:为什么是运行时异常,而不是编译时错误?

时间:2012-12-15 08:15:55

标签: java generics treeset

如果我创建一个没有实现Comparable的任意类,并尝试将其用作树集,则在插入对象时会在运行时抛出异常:

public class Foo {
}

public TreeSet<Foo> fooSet = new TreeSet<Foo>();
fooSet.add(new Foo()); // Throws a ClassCastException exception here: Foo is not comparable

我不是Java专家,但有些事情看起来像我没想到的那样动态地输入(ala Python)。 TreeSet的实现是否无法指定其泛型类型参数必须实现Comparable以便可以在编译时捕获它?非泛型函数可以将接口作为参数;与仿制药一样不可能吗?

1 个答案:

答案 0 :(得分:29)

TreeSet以这种方式实现,因为您可以alternatively provide Comparator,在这种情况下,元素不必是Comparable。在不将实现拆分为多个类的情况下支持这两种行为的唯一方法是包括运行时检查 - 这只是该类作者的设计决策。

TreeSet而不是公共构造函数公开工厂方法将是一种使用更严格的泛型类型约束来维护编译时间检查的方法,但这将是核心集合API公开公开的惯例的一个突破其实现类的no-arg和copy构造函数。正如您在评论中所指出的那样,Guava带有收藏品的工厂路线,而恕我直言更适合它。