例如当第二个Object添加到TreeSet时,下面的代码会抛出ClassCastException.已经写了TreeSet,所以type参数只能是一个可比较的类型?即TreeSet不会编译,因为Object不可比较.仿制药实际上做了他们的工作 – 是类型安全的.
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()); } }
解决方法
如果该类型必须是可比较的,则无法创建具有不可比较类型和比较器的TreeSet(可以像现在这样).
一种同时保持类型安全性的方法一直是有两个类:一个具有可比较的类型参数,一个具有不可比较的类型参数,没有默认构造函数(只有构造函数使用比较器),但是假设java开发人员不想引入基本上做同样的事情的两个类(虽然可以很容易地被实现为围绕另一个的包装).
另一个(可以说是更清晰的方法)是扩展类型系统,以便某些构造函数仅在与某些类型参数一起使用时才存在(即,如果类型参数是可比较的,默认构造函数才存在),但是我想这将使通用系统对于java来说太复杂了.