例如当第二个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());
}
}
答案 0 :(得分:13)
TreeSet
不要求其类型参数为Comparable
,因为它可能需要外部Comparator
来比较非Comparable
值。
答案 1 :(得分:5)
如果类型必须是Comparable,则无法创建具有不可比类型和比较器的TreeSet(您现在可以使用它)。
在保持类型安全的同时修复此问题的一种方法是使用两个类:一个具有可比较的类型参数,一个具有不可比较的类型参数,并且没有默认构造函数(只有采用Comparator的构造函数) ,但我想java开发人员不想引入两个基本上做同样事情的类(尽管可以很容易地将其作为另一个包装器实现)。
另一种(可以说更清晰的方式)是扩展类型系统,以便某些构造函数仅在与某些类型参数一起使用时才存在(即默认构造函数仅在类型参数具有可比性时才存在),但我想这会有使通用系统对于java来说过于复杂。
答案 2 :(得分:1)
那是因为 not 的值必须实现Comparable
。您可以显式传递集合Comparator
对象,在这种情况下,元素类型不需要是Comparable
。
答案 3 :(得分:0)
您还可以使用TreeSet
作为构造函数参数创建Comparator
。那么你的物品就不一定具有可比性。