【问题标题】:casting inside conditional operator in JavaJava中的条件运算符内部强制转换
【发布时间】:2015-07-09 23:00:12
【问题描述】:

这在 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());

【问题讨论】:

    标签: java eclipse list casting conditional-operator


    【解决方案1】:

    以下计算结果为布尔值。

    (allText != null)
    

    尚不清楚您的演员阵容如何工作。错误是正确的。

     (List<String>) (true or false)
    

    以下应该没问题。 (不确定我的问题是否正确)

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      您实际上根本不需要进行强制转换,因为编译器会在执行Collections.emptyList() 时推断出正确的类型

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-13
          • 1970-01-01
          • 2019-05-15
          • 2016-01-11
          • 1970-01-01
          • 2023-03-20
          • 2018-05-16
          • 2023-03-22
          相关资源
          最近更新 更多