在 Java 中投射内部条件运算符

casting inside conditional operator in Java

这在 eclipse 中给出了一个错误 IDE。(错误符号出现在行号附近)

String[] allText = null;

在此之后我做了一些事情,比如初始化数组等等。但是根据一些条件。所以我想使用如下的条件运算符。

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

如果我将我的转换放在等号之后,效果很好。(包装完整的三元运算) 出现这个错误的目的是什么?

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

以下计算结果为布尔值。

(allText != null)

不清楚您的演员表如何运作。错误是正确的。

 (List<String>) (true or false)

以下应该没问题。 (不确定我是否答对了你的问题)

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

查看 java.util.Collections 代码,emptyList() 方法如下所示:

public static <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

当您将 emptyList() 更改为 EMPTY_LIST 时,无需任何转换就可以了,但当然会有警告(EMPTY_LIST 是 EmptyList class 的一个实例,它是像所有列表 classes 一样通用)。问题是关于泛型参数,你必须设置类型。 如果你愿意,你可以那样做,甚至没有警告:

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

这是在抱怨,因为编译器试图将强制转换应用于三元运算符的第一部分,而不是整个表达式。所以这部分代码:

(List<String>) (allText != null)

这就是正在转换的内容,但 (allText != null) 的计算结果为布尔值。要使转换工作,您需要包含整个表达式,如下所示:

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

请注意整个三元运算符周围的括号。

实际上您根本不需要进行转换,因为编译器会在执行 Collections.emptyList()

时推断出正确的类型