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

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

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

我不是Java专家,但是有些东西似乎是以我没想到的方式动态地输入(ala Python)。 TreeSet的实现是否无法指定其generics类型参数必须实现Comparable以便可以在编译时捕获它? 非generics函数可以将接口作为参数; 仿制药是不可能的?

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

公开TreeSet工厂方法而不是公共构造函数将是一种使用更严格的generics类型约束来维护编译时间检查的方法,但这将是核心集合API公开公共非参数和复制构造函数的惯例的一个突破。它的实现类。 正如你在评论中指出的那样, Guava带着它的collections品走上了工厂路线,恕我直言就更好了。