10

例如,当将第二个对象添加到 TreeSet 时,下面的代码将引发 ClassCastException。不能编写 TreeSet 以使类型参数只能是 Comparable 类型吗?TreeSet 不会编译,因为 Object is not 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

4 回答 4

13

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

于 2010-04-13T19:06:07.120 回答
5

如果类型必须是 Comparable,则无法创建具有不可比较类型和 Comparator 的 TreeSet(您现在可以这样做)。

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

另一种(可以说是更干净的方法)是扩展类型系统,以便某些构造函数仅在与某些类型参数一起使用时才存在(即默认构造函数仅在类型参数可比较时才存在),但我想这会使泛型系统对于java来说太复杂了。

于 2010-04-13T19:06:12.050 回答
1

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

于 2010-04-13T19:06:53.697 回答
0

您还可以TreeSet使用 aComparator作为构造函数参数来创建 a。那么您的项目不必具有可比性。

于 2010-04-13T19:07:48.510 回答