Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Casting and dynamic vs static type in Java

Tags:

java

casting

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!

like image 469
XpdX Avatar asked Apr 20 '10 04:04

XpdX


People also ask

What is static and dynamic type in Java?

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.

Is Java static or dynamic type?

Java is statically-typed, so it expects its variables to be declared before they can be assigned values.

What is the difference between static and dynamic typing?

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.

Does casting change static type java?

– Casting a reference variable v does not change its static type.


1 Answers

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.

like image 129
polygenelubricants Avatar answered Oct 25 '22 03:10

polygenelubricants