日期:2014-05-20  浏览次数:20903 次

java强制类型转换的风险及原理讨论
小弟一直对java中的强制类型转换心存疑虑,关于它的原理方面的东西,也希望有能力者聊聊。
平时开发的时候,我特别注意了这样一点:
简单类型的数据强制转换时,编译器一般不会给出警告提示:
Object o = new Object();
String s = (String)o;//没有warn 提示
(Map<String,List<Object>>)SessionPool.getClient().get(MemoryData.HOTEST_DPI_APPS_ID_LIST_MAP_KEY))//有异常提示

所以关于这块的原理,我就不明白了。请指教!


------解决方案--------------------
子转化成父没有问题
父转化成子有风险
------解决方案--------------------
探讨
子转化成父没有问题
父转化成子有风险

------解决方案--------------------
(Map<String,List<Object>>)SessionPool.getClient().get(MemoryData.HOTEST_DPI_APPS_ID_LIST_MAP_KEY))//有异常提示


是因为泛型的缘故,不然也不会提示
------解决方案--------------------
ClassCastException是一个runtimeException ide不会提示
至于类转型的问题...这个自己翻书吧...基础很重要的...
泛型的转型和类无关,提示的警告是不明确的泛型对象,因为泛型不存在于运行期,存在你转出的泛型可能和实际类型不同
------解决方案--------------------
从具体到抽象或者说从小范围到大范围,安全
从抽象到具体或者说从大范围到小范围,风险

之所以只是风险,是java中抽象(大范围)类型的外表下藏匿着具体(小范围)类型的内在,未知。

还有就是上面提到的编译期无转型风险提示是因为在编译期无法知道运行期变量具体类型
------解决方案--------------------
引用Effective Java中的非常有价值的建议
...
优先考虑泛型和泛型方法
List优先与数组
...