(C)a.foo()
等价于 ,即问题中的 #2。(C)(a.foo())
要获得#1,您必须编写.((C)a).foo()
Java 语言规范没有在一个漂亮、易于阅读的摘要中指定运算符优先级。
Sedgewick 和 Wayne 的附录 A《Java 编程导论》有一个全面的运算符优先级表。
Java编程语言的附录B有一个运算符优先级表,但它不如Sedgewick的那么完整。
仔细检查 Java 语言规范中的语法可以确定所讨论的强制转换和方法调用表达式的相对优先级:
Expression:
Expression1 [AssignmentOperator Expression1]]
Expression1:
Expression2 [Expression1Rest]
Expression1Rest:
? Expression : Expression1
Expression2 :
Expression3 [Expression2Rest]
Expression2Rest:
{InfixOp Expression3}
Expression3 instanceof Type
Expression3:
PrefixOp Expression3
( Expression | Type ) Expression3
Primary {Selector} {PostfixOp}
Primary:
ParExpression
NonWildcardTypeArguments (ExplicitGenericInvocationSuffix | this Arguments)
this [Arguments]
super SuperSuffix
Literal
new Creator
Identifier { . Identifier }[ IdentifierSuffix]
BasicType {[]} .class
void.class
相关作品加粗。我们可以看到,强制转换表达式与生产相匹配。方法调用通过生产来匹配生产。综上所述,我们看到方法调用表达式将被视为一个单元(a),由强制转换来操作。Expression3 : (Expression|Type) Expression3
Expression3 : Primary {Selector} {PostfixOp}
Primary: Identifier {. Identifier }[IdentifierSuffix]
Expression3
嗯,优先级图表更容易遵循... ;)