Java if ternary operator and Collections.emptyList()

2022-09-04 19:42:27

您能解释一下为什么使用第一个返回类型时代码无法编译吗?消息是: 。Type mismatch: cannot convert from List<capture#1-of ? extends Object> to List<String>

在第二种情况下是否插入了显式强制转换?

public class GenericsTest {

        private String getString() {
            return null;
        }

        public List<String> method() {
            String someVariable = getString();
            //first return type
            //return someVariable == null ? Collections.emptyList() : Collections.singletonList(someVariable);
            //second return type
            if (someVariable == null) {
                return Collections.emptyList();
            } else {
                return Collections.singletonList(someVariable);
            }
        }
    }

答案 1

因为类型推断规则。我不知道究竟为什么(你应该检查JSL,三元运算符部分),但似乎三元表达式没有从返回类型推断类型参数。

换句话说,三元表达式的类型取决于其操作数的类型。但其中一个操作数具有未确定的类型参数 ()。此时,三元表达式仍然没有类型,因此它不会影响类型参数。有两种类型需要推断 - 一种是三元表达式的结果,另一种是方法的类型参数。Collections.emptyList().emptyList()

用于显式设置类型Collections.<String>emptyList()


答案 2

表达式的类型是两种情况下最常见的类型。flag ? trueCase : falseCase

在这种情况下,最常见的类型是 和 是因为它不能“看到将来”,这应该在表达式中返回。Collections.emptyList()Collections.singletonList(someVariable)List<? extends Object>Collections.emptyList()List<String>


当您执行以下操作时:

return Collections.emptyList();

编译器可以是智能的,通过返回类型检测类型并检查正确性(推断)。


推荐