usc*_*emy 15 java generics treeset
如果我创建一个没有实现Comparable的任意类,并尝试将其用作树集,则在插入对象时会在运行时抛出异常:
public class Foo {
}
public TreeSet<Foo> fooSet = new TreeSet<Foo>();
fooSet.add(new Foo()); // Throws a ClassCastException exception here: Foo is not comparable
Run Code Online (Sandbox Code Playgroud)
我不是Java专家,但有些事情看起来像我没想到的那样动态地输入(ala Python).TreeSet的实现是否无法指定其泛型类型参数必须实现Comparable以便可以在编译时捕获它?非泛型函数可以将接口作为参数; 仿制药是不可能的?
Pau*_*ora 30
TreeSet以这种方式实现,因为你可以选择提供一个Comparator,在这种情况下元素不需要Comparable.在不将实现分成多个类的情况下支持这两种行为的唯一方法是包括运行时检查 - 这只是该类作者的设计决策.
公开TreeSet构造函数公开工厂方法将是一种使用更严格的泛型类型约束来维护编译时间检查的方法,但这将是核心集合API公开公开的非参数和复制构造函数的惯例.实施课程.正如你在评论中指出的那样,Guava带着它的收藏品走上了工厂路线,恕我直言就更好了.
| 归档时间: |
|
| 查看次数: |
4124 次 |
| 最近记录: |