没有双括号的强制转换参考变量

时间:2019-05-11 23:32:06

标签: java

给出以下两个类:

class A {}

class B extends A {
    int b;
}

基于以下运算符优先级表:http://www.cs.bilkent.edu.tr/~guvenir/courses/CS101/op_precedence.html

两个运算符().的优先级相同,并且它们从左到右进行评估(关联性)。

A a = new B();
assert (B)a.b == 0;

以上代码片段应编译并成功声明,因为首先对括号运算符进行了评估(将引用a转换为类型B),然后访问强制转换引用的b成员变量,该变量返回一个值0

为什么上面的陈述不是这样?

2 个答案:

答案 0 :(得分:4)

您将优先级15的() 括号与优先级13的( type ) 一元类型转换混淆。

优先级15的. 成员选择比强制类型转换高,因此(B)a.b的意思是(B) (a.b),这就是为什么您需要编写{{ 1}}来获得想要的东西。

part of precedence table

答案 1 :(得分:3)

这些括号是一元类型转换,其优先级低于.成员选择。

Precedence   Operator    Type                     Associativity
----------   --------    ----                     -------------
15           ()          Parentheses              Left to Right
             []          Array subscript
             .           Member selection

14           ++          Unary post-increment     Right to left
             --          Unary post-decrement

13           ++          Unary pre-increment      Right to left
             --          Unary pre-decrement 
             +           Unary plus
             -           Unary minus
             !           Unary logical negation
             ~           Unary bitwise complement
             ( type )    Unary type cast