Teniendo en cuenta el siguiente dos clases:
class A {}
class B extends A {
int b;
}
En base a la siguiente tabla de operadores de precedencia: http://www.cs.bilkent.edu.tr/~guvenir/courses/CS101/op_precedence.html .
Tanto los operadores ()
y .
tienen la misma prioridad y se evalúan de izquierda a derecha (asociatividad).
A a = new B();
assert (B)a.b == 0;
el fragmento de código anterior debe compilar y afirma con éxito como el operador paréntesis se evalúa primero (casting referencia a
a tipo B
), entonces el acceso de la referencia fundido b
variable miembro que devuelve un valor de 0
.
¿Por qué es la afirmación anterior no es el caso?
Usted está confundiendo los ()
paréntesis en precedencia 15 con la ( type )
conversión de tipo Unario en precedencia 13.
La .
selección de miembros en precedencia 15 es más alta que la conversión de tipo, por lo que (B)a.b
los medios (B) (a.b)
, por lo que tiene que escribir ((B) a).b
para conseguir lo que desea.