Java 不带双括号的强制转换引用变量

Java 不带双括号的强制转换引用变量,java,Java,鉴于以下两类: class A {} class B extends A { int b; } 基于以下运算符优先级表: 两个操作符()和具有相同的优先级,它们从左到右求值(关联性) 当首先计算圆括号操作符时(将引用a转换为类型B),然后访问转换引用的B成员变量,该变量返回值0,上述代码段应该编译并成功断言 为什么上面的语句不是这样?这些括号是一元类型转换,其优先级低于成员选择 优先运算符类型关联性 ---------- -------- ----

鉴于以下两类:

class A {}

class B extends A {
    int b;
}
基于以下运算符优先级表:

两个操作符
()
具有相同的优先级,它们从左到右求值(关联性)

当首先计算圆括号操作符时(将引用
a
转换为类型
B
),然后访问转换引用的
B
成员变量,该变量返回值
0
,上述代码段应该编译并成功断言

为什么上面的语句不是这样?

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

优先运算符类型关联性
----------   --------    ----                     -------------
15()括号从左到右
[]数组下标
.           成员选择
14++从右到左的一元后置增量
--一元后减量
13++从右到左的一元预增量
--一元预减量
+一元加号
-一元负号
!           一元逻辑否定
~1元按位补码
(类型)一元类型转换

您将优先级15中的
()
括号与优先级13中强制转换的
(类型)
一元类型混淆了

优先级为15的
成员选择高于类型转换,因此
(B)a.B
意味着
(B)(a.B)
,这就是为什么您需要编写
((B)a.B
以获得所需内容的原因

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