16

如果我创建一个未实现 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 以便可以在编译时捕获?非泛型函数可以将接口作为参数;泛型是不可能的吗?

4

1 回答 1

32

TreeSet以这种方式实现,因为您可以选择提供a Comparator,在这种情况下,元素不需要是Comparable. 在不将实现拆分为多个类的情况下支持这两种行为的唯一方法是包含运行时检查——这只是该类作者的设计决定。

公开工厂方法TreeSet而不是公共构造函数本来是一种使用更严格的泛型类型约束来维护编译时检查的方法,但这将打破核心集合 API 为其公开公共无参数和复制构造函数的约定实现类。正如您在评论中指出的那样,番石榴的收藏品走的是工厂路线,恕我直言,它更适合它。

于 2012-12-15T08:19:07.023 回答