Casting and dynamic vs static type in Java

泪湿孤枕 提交于 2019-12-12 07:56:06

问题


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!


回答1:


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.



来源:https://stackoverflow.com/questions/2672645/casting-and-dynamic-vs-static-type-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!