所以,我有一个类,其中构造函数如下:
public FilterList(Set<Integer> labels) {
...
}
我想构建一个新的FilterList
对象并使用空集合。根据Joshua Bloch在他的书《Effective Java》中的建议,我不想为空集合创建新的对象;我将使用Collections.emptySet()
代替:
FilterList emptyList = new FilterList(Collections.emptySet());
这让我报错,抱怨 java.util.Set<java.lang.Object>
不是一个 java.util.Set<java.lang.Integer>
。好的,那这个呢:
FilterList emptyList = new FilterList((Set<Integer>)Collections.emptySet());
这个也给我出错了!好的,那么这个呢:
Set<Integer> empty = Collections.emptySet();
FilterList emptyList = new FilterList(empty);
嘿,它起作用了!但是为什么?毕竟Java没有类型推断,这就是为什么如果你做Set<Integer> foo = new TreeSet()
而不是Set<Integer> foo = new TreeSet<Integer>()
,你会得到未经检查的转换警告。但是Set<Integer> empty = Collections.emptySet();
却可以在没有警告的情况下工作。为什么呢?
FilterList emptyList = new FilterList((Set<Integer>)(Set<? extends Object>)Collections.emptySet());
- EricSSet<Integer> emptySet = (Set<Integer>)Collections.emptySet();
无法编译。 - neo