(C)a.foo()
相當於(C)(a.foo())
,即問題中的#2。
要獲得#1,您必須編寫((C)a).foo()
。
Java語言規範沒有在一個很好的,易於閱讀的總結中指定運算符優先級。
Appendix A of Sedgewick and Wayne的Java編程介紹有一個運算符優先級的綜合表。
The Java Programming Language的附錄B有一個運算符優先級表,但它不像Sedgewick's那樣完整。
的grammar在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
相匹配。方法調用通過生產Primary: Identifier {. Identifier }[IdentifierSuffix]
匹配生產Expression3 : Primary {Selector} {PostfixOp}
。綜合起來,我們可以看到方法調用表達式將被視爲一個單元(一個Expression3
)被演員處理。
嗯,優先圖是容易按照...;)
快速查找方法是在C.foo和B.foo中設置斷點並調試。那麼無論哪一個被擊中都會回答你的問題。順便問一下 – Spidy 2011-04-23 04:57:07
嗯,我不知道Eclipse是否會讓我在Java核心類中設置斷點... :-) – corsiKa 2011-04-23 04:58:34
你可以在你自己的引用庫上做這件事,所以我會認爲核心庫的反應是一樣的。只要你有源代碼連接,它可以讓你設置斷點(沒有測試過,看它們是否實際觸發) – Spidy 2011-04-23 05:02:35