以前没觉得java的类型系统有什么问题. 不过就两条机制在,box/unbox的问题而已. 当然,接触java的时间不算久,所以没有经历过那段没有autobox的日子. 不过,从一些例子看来,autobox也未必是好事情. 比如这段代码int n = 0; int another = int.class.cast(n);从表面上看来,这应该是一段很符合表面语义的代码. 一个类型转换,而且应该是没什么问题的. 只是,由于cast的函数声明参数是一个Object. 而在java里,primitive和object是两套类型系统. 在java引入autobox之前,这段代码应该是会编译错误的. 但是,有了autobox之后,没有编译错误,但是肯定会有运行错误. 在调用的时候,java隐式地将int box成java.lang.Integer. 想想,既然有autobox,那么应该也问题不大. 最多返回Integer之后,再unbox隐式转换回int. 但问题是,cast做了一些类型兼容的检测. 从jvm的角度来说,int和Integer是两个不兼容的类型. 于是,在调用cast的时候,会抛一个ClassCastException. 也就是说,在java两套类型系统存在的前提下, primitive.class.cast()的行为就变得有些古怪了. 一些语义上看上去无误的代码,也许运行时就必然要抛异常. 当然,对于这类可以显式调用的也许可以避免. 但程序复杂了就难免会有这样那样的trick/trap. 比如:void这段代码. 初看上去似乎还行.实现了某种程度的模板/复用. 但是,注意那个cast. 所以,很难保证在实际情况下不会出现这种box/unbox带来的cast的问题. 于是,解决方案就是尽量避免使用cast做转型,或者时刻记住box/unbox的问题. 问题是,如果不用cast转型就要自己写个检测null的东西了. 这当然不是什么大问题. 最好的方法估计还是统一一下类型系统吧. 做接口的时候也许最好是使用非primitive的类型吧. 这样或许能够避免一些问题. 虽然在诸如做序列化的时候,非primitive类型会有一些额外开销. 不过,真要做序列化的话,这些开销也是可以避免的. 比如,最直接的一堆if,else做对应的类型映射. 总而言之,java的两个类型系统是个头疼的存在. 不仅存在陷阱,还使得在做reflect的时候经常让人崩溃. 在这方面,后来者C#做得貌似就好得多了. 比较,Java老了. 语言这东西,也许不是说年代越久越成熟. 毕竟,需要解决的总是新问题.Type method(Class type){ .... return type.class.cast(value); }
2010-12-05
Java Class.cast的问题
订阅:
博文评论 (Atom)
野蛮生长
前段时间看了下Coinbase的API想着写点东西. 想着多少是涉及钱的东西,所以想着看看能不能不用SDK. 毕竟感觉上,本身就不是个什么特别正规的行业,而且盯着的人也多,供应链上难说没有什么问题. 粗略翻了下文档,倒也不算写得不好. 除去SDK之外,还是有标准的Http JWT...
-
看完了一部未完成的电影. 这部片片子比较有意思的是一开始那段自嘲. 秦昊关于既然拍了也播不了,只是私下小圈子里自嗨的事情又什么意义的质问. 片里导演也 讪讪地承认生活的现实. 到这里其实沿着原有的思路,把补拍和一些意外穿插进去,可能还是一个不错的文艺片. 至少于戏里戏外的导演来说...
-
看 金枝 ,读到关于求雨的各种巫术习惯的时候忽然发觉,这其实跟当时的社会需求有关吧. 农业为主,自然是靠天吃饭,尤其在无法弄清下雨原因的时候. 这种"崇拜"虽然说是出于"无知",但究其本质还是因为对于天气有着不可替代的需求. 有所求的...
-
去看了长安的荔枝. 前半段还可以,尤其像荔枝林里不知道是笑还是哭的几个镜头表演算是相当出色了. 结合人物背景的那种对目标的绝望与对当下人际环境的希望的交叉矛盾心理. 后半段就有些过滤潦草了. 如果说整片是对于一骑红尘妃子笑,无人知是荔枝来的解构的话. 带入民生潦倒涂炭这点是没问题...
没有评论:
发表评论