JAVA强制类型转换的那些坑!!!

JAVA强制类型转换的时候,在编译期间,只会校验是否有继承的关系而已!!!不会去校验继承关系的顺序,也不会去校验实现关系!!!
也就是说,父类强转成子类,以及某个类强转成任何接口,都不会在编译时报错。只会在运行时报错。
比较典型的例子,object对象,可以在编译期强转成任何对象(因为它本身是所有对象的父类)、以及任何接口。却不会报错。。。。这是个巨坑呀。所以代码编译过了,不一定就是对的。

下列错误代码在编译器里面不会报错。

Object  object=new  Object();
ControllerUploadCtx  wrong1=(ControllerUploadCtx)object;
Map  wrong2=(Map)object;

还有一种很坑的应用场景。
像eat( Map m )这种接受接口的方法,在编译时,任何对象都可以通过eat((Map)xxx )的强转方式,接受到任何的对象。。。即使这个对象没有实现Map接口,在编译时都会被报错。

看到强转一定要分外留心:

强转为接口类型:
我们一般都没看到过强转成接口的。是因为你接口肯定是类的上层,像

HashMap hashMap = new HashMap() ; 
Map a = hashMap; 

根本就不需要写成Map a = (Map)hashMap; 因为没有必要。所以我们基本就看不到强制转换成接口的。
如果你发现了有这种强转为接口的使用,就要分外小心了。因为对的时候它没必要,错的时候它还不会编译报错。

强转为类类型:
有继承关系之间的类的强转,能转换的没问题,不能转换的情况下,在编译时也不会报错。

发布了14 篇原创文章 · 获赞 6 · 访问量 7765

猜你喜欢

转载自blog.csdn.net/freshrookie/article/details/84961020