gpt4 book ai didi

java - 为什么将 Collections.emptySet() 与泛型一起使用在赋值中而不是作为方法参数?

转载 作者:IT老高 更新时间:2023-10-28 20:26:04 26 4
gpt4 key购买 nike

所以,我有一个带有这样构造函数的类:

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();甚至在没有警告的情况下工作。这是为什么呢?

最佳答案

简短的回答是 - 这是 Java 通用系统中类型推断的限制。它可以根据具体变量推断泛型类型,但不能根据方法参数推断。

怀疑这是因为方法是根据拥有对象的运行时类动态调度的,所以在编译时(当 all 通用信息被解析时)你可以'实际上并不确定方法参数的类是什么,因此无法推断。变量声明很好,而且是不变的,所以你可以。

其他人可能能够提供更多详细信息和/或一个不错的链接。 :-)

在任何情况下,您始终可以为泛型调用显式指定类型参数,如下所示:

Collections.<Integer>emptySet();

甚至可以同时使用多个参数,例如

Collections.<String, Boolean>emptyMap(); // Returns a Map<String, Boolean>

在无法进行推理的情况下,这通常看起来比强制转换要干净一些。

关于java - 为什么将 Collections.emptySet() 与泛型一起使用在赋值中而不是作为方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3061837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com