gpt4 book ai didi

java - Collections.emptyList() 返回一个 List?
转载 作者:bug小助手 更新时间:2023-10-28 10:39:41 27 4
gpt4 key购买 nike

我在使用 Java 推断泛型类型参数的规则时遇到了一些麻烦。考虑下面的类,它有一个可选的列表参数:

import java.util.Collections;
import java.util.List;

public class Person {
private String name;
private List<String> nicknames;

public Person(String name) {
this(name, Collections.emptyList());
}

public Person(String name, List<String> nicknames) {
this.name = name;
this.nicknames = nicknames;
}
}

我的 Java 编译器出现以下错误:

Person.java:9: The constructor Person(String, List<Object>) is undefined

但是Collections.emptyList()返回类型 <T> List<T> ,而不是 List<Object> .添加类型转换没有帮助

public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}

产量

Person.java:9: inconvertible types

使用 EMPTY_LIST而不是 emptyList()

public Person(String name) {
this(name, Collections.EMPTY_LIST);
}

产量

Person.java:9: warning: [unchecked] unchecked conversion

而以下更改使错误消失:

public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}

谁能解释一下我在这里遇到了什么类型检查规则,以及解决它的最佳方法?在这个例子中,最终的代码示例是令人满意的,但是对于更大的类,我希望能够在不重复代码的情况下按照这种“可选参数”模式编写方法。

额外奖励:何时使用 EMPTY_LIST 比较合适而不是 emptyList() ?

最佳答案

您遇到的问题是,即使方法 emptyList()返回 List<T> ,你还没有提供类型,所以它默认返回 List<Object> .您可以提供类型参数,并让您的代码按预期运行,如下所示:

public Person(String name) {
this(name,Collections.<String>emptyList());
}

现在,当您进行直接赋值时,编译器可以为您找出泛型类型参数。这称为类型推断。例如,如果您这样做:

public Person(String name) {
List<String> emptyList = Collections.emptyList();
this(name, emptyList);
}

然后是 emptyList()调用将正确返回 List<String> .

关于java - Collections.emptyList() 返回一个 List<Object>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/306713/

27 4 0