(C)a.foo()等价于
(C)(a.foo()),即问题中的#2。
要获得#1,您必须编写
((C)a).foo()。
Java语言规范没有在易于理解的摘要中指定运算符优先级。
Sedgewick和Wayne撰写的
Java编程简介 附录A中有一张完整的运算符优先级表。
Java编程语言的附录B
有一个运算符优先级表,但它不如Sedgewick的完整。
仔细检查Java语言规范中的语法可以确定所涉及的强制转换和方法调用表达式的相对优先级:
**表达式** : **expression1** [AssignmentOperator表达式1]表达式1: **expression2** [expression1Rest]expression1Rest: ?表达式:expression1表达式2: **expression3** [expression2Rest]expression2Rest: {InfixOp expression3} expression3 instanceof类型表达式3: PrefixOp表达式3 **(表达式|类型)expression3** **Primary** {选择器} {PostfixOp}主: Parexpression NonWildcardTypeArguments(ExplicitGenericInvocationSuffix |此参数) 这个[参数] 超级后缀 文字 新造物主 **标识符{。 标识符} [IdentifierSuffix]** BasicType {[]} .class 无效类相关作品以粗体显示。我们可以看到强制转换表达式与生产匹配
expression3 : (expression|Type)expression3。方法调用通过生产匹配
expression3 : Primary {Selector}{PostfixOp}生产Primary: Identifier {. Identifier}[IdentifierSuffix]。综上所述,我们看到方法调用表达式将被视为强制转换执行的单元(an expression3)。
嗯,优先级图表更容易遵循…;)



