JLS SE
8在(§15.2)中说:
当某些表达式出现在某些上下文中时,它们被视为多表达式。以下形式的表达式可以是多边形表达式:
带括号的表达式(第15.8.5节)
类实例创建表达式(第15.9节)
方法调用表达式(第15.12节)
方法引用表达式(第15.13节)
条件表达式(第15.25节)
Lambda表达式(§15.27)
因此,从规范的这一部分可以清楚地看出,条件表达式(即三元运算符)可以视为多表达式。但是,并非所有条件表达式都可以视为多表达式,只能引用根据(§15.25)的条件表达式。(§15.25.3)阐明了可以将参考条件表达式视为多表达式的条件:
如果引用条件表达式出现在分配上下文或调用上下文中(第5.2节至第5.3节),则它是一个多边形表达式。否则,它是一个独立的表达式。
当多引用条件表达式出现在目标类型为T的特定种类的上下文中时,其第二和第三操作数表达式类似地出现在目标类型为T的相同种类的上下文中。
多边形引用条件表达式的类型与其目标类型相同。
检查示例中条件表达式是否出现在赋值上下文中,因为根据(§14.17):
当带有表达式的return语句出现在方法声明中时,该表达式必须可分配给该方法的声明返回类型(第5.2节),否则会发生编译时错误。
那么到最后,这意味着什么?这意味着,当条件表达式为多边形表达式时,目标类型将“推入”到每个操作数中。这样,编译器可以将条件的每个部分归于目标。您的目标是
List<String>。如果我们检查emptyList()方法的定义,我们将:
@SuppressWarnings("unchecked")public static final <T> List<T> emptyList() { return (List<T>) EMPTY_LIST;}因此,使用target
List<String>,编译器可以推断出T == String且代码已被接受。



