gpt4 book ai didi

java - Collections.emptyList() 和/或 Java 泛型方法的奇怪类型推断行为?

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:44 24 4
gpt4 key购买 nike

这是jdk1.7.0_04

我试图使用 Collections.emptyList() 而不是 new 在有条件的情况下建立我自己的空列表:

List<String> list = (anArray != null) ? Arrays.asList(anArray) : Collections.emptyList();

但出现以下错误:

error: incompatible types
List<String> list = (anArray != null) ? Arrays.asList(anArray) : Collections.emptyList();
^
required: List<String>
found: List<CAP#1>
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ? extends Object
1 error

我能够确定我需要将事情更改为:

List<String> list = (anArray != null) ? Arrays.asList(anArray) : Collections.<String>emptyList();

但作为这项工作的一部分,我遇到了奇怪的(无论如何对我来说)情况:

List<String> alwaysEmpty = Collections.emptyList();

编译正常,但是:

List<String> alwaysEmpty = (List<String>) Collections.emptyList();

给出以下编译错误:

error: inconvertible types
List<String> alwaysEmpty = (List<String>) Collections.emptyList();
^
required: List<String>
found: List<Object>

什么鬼??

现在我可以理解,也许出于某种奇怪的原因,条件运算符的使用以某种方式阻止了类型推断系统意识到 emptyList() 调用的类型参数应该是 String 等需要显式指定。但为什么插入一个(公认是多余的)转换会把事情搞砸?

最佳答案

But why does inserting a (admittedly redundant) cast mess things up?

因为现在表达式 Collections.emptyList() 本身不是任何赋值的目标 - 那么应该选择什么类型的参数?最好只指定类型参数:

// Redundant here, but just as an example
List<String> alwaysEmpty = Collections.<String>emptyList();

条件运算符也一样:

public static void main(String[] args) {              
List<String> list = (args != null)
? Arrays.asList(args) : Collections.<String>emptyList();
}

关于java - Collections.emptyList() 和/或 Java 泛型方法的奇怪类型推断行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10486657/

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