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