I’m learning about static vs dynamic types, and I am to the point of understanding it for the most part, but this case still eludes me.
If class B extends A, and I have:
A x = new B();
Is the following allowed?:
B y = x;
Or is explicit casting required?:
B y = (B) x;
Thanks!
Explicit casting is required, and will succeed.
The reason why it’s required is because it doesn’t always succeed: a variable declared as
A xcan refer to instances that aren’tinstanceof B.Whether or not a cast is required is determined only by the declared types of the variables involved, NOT by the types of the objects that they are referring to at run-time. This is true even if the references can be resolved at compile-time.
Here, even though the
finalvariableowill always refer to aninstanceof String, its declared type is stillObject, and therefore an explicit(String)cast is still required to compile.