Java铸造订单
|
假设我有以下设置 class A {
B foo();
}
class C extends B {
}
// later
A a = new A();
C theFoo = (C)a.foo();
我们知道a.foo()返回类型B. 当我做(C)a.foo(),是吗 >将一个转换为C类,然后尝试调用foo()呢? 我发现很难确定,并且一直只是在谨慎的一边加上额外的括号(这不是一个坏主意,可读性,但现在我很好奇) 这是具体引用ObjectInputStream.readObject(),尽管我看不到如何改变行为. 解决方法(C)a.foo()等同于(C)(a.foo()),即问题中的#2.要得到#1,你必须写((C)a).foo(). Java语言规范不会在一个不错的,易于阅读的摘要中指定运算符优先级. 由Sedgewick和Wayne编写的Java简介Appendix A具有运算符优先级的综合表. The Java Programming Language附录B有一个运算符优先表,但并不像Sedgewick那样完整. Java语言规范中的grammar的仔细检查可以确定有关的转换和方法调用表达式的相对优先级:
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 {匹配生产Expression3:Primary {Selector} {PostfixOp}.标识符} [IdentifierSuffix].将它们放在一起,我们看到方法调用表达式将被视为一个单元(一个Expression3),由演员进行操作. 嗯,优先图更容易遵循…) (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
