5

这是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,因此需要明确指定。但是为什么插入一个(公认是多余的)演员会把事情搞砸呢?

4

2 回答 2

9

但是为什么插入一个(公认是多余的)演员会把事情搞砸呢?

因为现在表达式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();
}
于 2012-05-07T17:51:45.673 回答
5

我将接受乔恩的回答,但也想列出某人刚刚在 SO 之外传递给我的关于此问题的答案。它是提交给 Sun/Oracle 的关于这件事的错误报告的链接。评估错误的人对正在发生的事情有一个有用的解释。摘录:

这里的提交者似乎假设条件表达式的类型是分配的 LHS 上的类型(List<String>在这种情况下)。这不是真的:如 JLS 所述,条件表达式的类型:

“条件表达式的类型是将捕获转换(第 5.1.10 节)应用到lub(T1, T2)(第 15.12.2.7 节)的结果。”

重要的是要了解为什么需要使用 lub。考虑以下示例:

class A {}
class B extends A{}
class C extends A{}
class Foo<X> 
Foo<? extends A> l = b ? new Foo<B>() : new Foo<C>()

在这种情况下,我们有 LHS 是类型Foo<? extends A>,而 RHS 是类型lub(Foo<B>, Foo<C>),即Foo<? extends B&C>

于 2012-05-07T17:59:14.007 回答