给定以下两个类:
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
的成员变量。
为什么上面的说法不是这样?
最佳答案
您混淆了优先级 15 中的 ()
括号 与 ( type )
一元类型转换优先级 13.
.
成员选择优先级为15,高于类型转换,所以(B)a.b
表示(B) (a.b)
,这就是为什么你需要编写 ((B) a).b
来获得你想要的。
关于java - 在没有双括号的情况下转换引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56095047/