Ответ 1
(C)a.foo()
эквивалентен (C)(a.foo())
, то есть # 2 в вопросе.
Чтобы получить # 1, вам нужно написать ((C)a).foo()
.
Спецификация языка Java не определяет приоритет оператора в хорошем, легко читаемом сводке.
Приложение A Введение в программирование на Java от Sedgewick и Wayne имеет исчерпывающую таблицу приоритетов операторов.
Приложение B Язык программирования Java имеет таблицу приоритетов операторов, но она не такая полная, как Sedgewick's.
Тщательный контроль грамматики в Спецификации языка 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
Соответствующие постановки выделены жирным шрифтом. Мы можем видеть, что выражение для литья соответствует произведению Expression3 : (Expression|Type) Expression3
. Вызов метода соответствует произведению Expression3 : Primary {Selector} {PostfixOp}
с помощью производства Primary: Identifier {. Identifier }[IdentifierSuffix]
. Объединяя это вместе, мы видим, что выражение вызова метода будет рассматриваться как единица (a Expression3
), на которую будет действовать актерский состав.
Хммм, диаграмма приоритета легче следовать...;)