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!
Roughly saying, statically typed languages are those in which types are known at compile time. Dynamically typed languages are those in which types are checked at runtime. There is a third category here, untyped languages, like forth or assembly.
Java is statically-typed, so it expects its variables to be declared before they can be assigned values.
Statically typed languages: each variable and expression is already known at compile time. Dynamically typed languages: variables can receive different values at runtime and their type is defined at run time. Examples: Ruby, Python.
– Casting a reference variable v does not change its static type.
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 x
can refer to instances that aren't instanceof B
.
// Type mismatch: cannot convert from Object to String
Object o = "Ha!";
String s = o; // DOESN'T COMPILE
// Compiles fine, cast succeeds at run-time
Object o = "Ha!";
String s = (String) o;
// Compiles fine, throws ClassCastException at run-time
Object o = Boolean.FALSE;
String s = (String) o;
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.
final Object o = "Ha!";
String s = o; // STILL doesn't compile!!!
Here, even though the final
variable o
will always refer to an instanceof String
, its declared type is still Object
, and therefore an explicit (String)
cast is still required to compile.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With