为什么将 Collections.emptySet() 与泛型一起使用在赋值中起作用,但不能用作方法参数?
2022-08-31 17:10:03
所以,我有一个带有如下构造函数的类:
public FilterList(Set<Integer> labels) {
...
}
我想用一个空集构造一个新对象。遵循Joshua Bloch在他的书《Effective Java》中的建议,我不想为空集创建一个新对象;我将改用:FilterList
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();