浏览 3318 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-08-22
http://forum.iteye.com/viewtopic.php?t=21933
说实话,这还真得感谢hongliang兄弟提的问题:我以前一直用1.4的编译器,对于5.0的了解太少了,(想要了解java5中所做的改变请访问:http://java.sun.com/docs/books/vmspec/2nd-edition/jvms-clarify.html,我刚找到的)所以开始对hongliang兄弟写的代码感到奇怪,后来为了看是否可以解决他的问题,照他这样写,eclipse提示我使用5.0编译器,就这样一步步的我开始了解"泛型"这个新的术语,然后我想到我前段时间一个按JVM2规范读取Class文件信息的程序用它来对java.util.Map进行测试,结果真的出错了. 我发现有一点(这是发现的第一点,还有没发现的,呵呵)是我没有支持对"泛型"的分析,但就常量池(把错误忽略了,呵呵)有这样的信息:<T:Ljava/lang/Object;>(TT;)TT;我开始不解,后来看了http://www-128.ibm.com/developerworks/cn/java/j-cwt02076.html这篇文章后知道了怎么回事. 然后,为了对泛型有一定的认识我花了很长时间把这篇文章:http://www-128.ibm.com/developerworks/edu/j-dw-java-generics-i.html(对泛型还不了解的朋友对这篇文章一定很感兴趣--也许只有我还这么老土吧!呵呵!)想了解更多的朋友可以看看这个:http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf. 说了一大堆的费话,下面说说我要问的问题: 看看这段代码,既然不会出现任何问题 Map map = new HashMap<Integer,String>();; map.put(new Integer(9);,"riss");; map.put("riss","riss");; 如果这么写就不能编译: Map<Integer,String> map = new HashMap<Integer,String>();; map.put(new Integer(9);,"riss");; map.put("riss","riss");; Map前只是多了这么个<Integer,String>就会有问题,我的观点是:既然使用HashMap<Integer,String>创建的Map应该自然是<Integer,String>的吗?这倒好,我放两个字符串都不报错,不信你试试! 不知道该怎么解释得好,(是Sun做的不够好,还是我理解有问题)?大家说说呢? 也许刚看了这么多文章,脑袋不清醒了吧,不过还是请大家先发表下自己的见解,我今天回去清醒清醒下,明日,再和大家讨论! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-08-22
riss 写道 说了一大堆的费话,下面说说我要问的问题: 看看这段代码,既然不会出现任何问题 Map map = new HashMap<Integer,String>();; map.put(new Integer(9);,"riss");; map.put("riss","riss");; 这个只能通过编译,但是运行应该通不过吧! 编译的时候看虚礼机只看这个:Map map 运行的时候看这个HashMap<Integer,String>() |
|
返回顶楼 | |
发表时间:2006-08-22
Java Generic的目的是编译期类型检查。
Java Generic的实现方法是Type Erasure,编译结果里面并没有保留具体类型信息,就是说,运行期不进行类型检查。 楼主的第一段代码运行可以通过。 c# 2.0以上的Generic的实现方案不是Type Erasure,而是Reification 类型具体化 -- 编译结果保留了Generic类型信息,从而可以运行时类型检查,Reflection获取Generic类型信息。当然,c#也就不支持wildcard -- <?>。 http://gafter.blogspot.com/2004/09/puzzling-through-erasure-answer.html |
|
返回顶楼 | |
发表时间:2006-08-23
To 温柔一刀:运行时可以通过,你可以试试哈!
To buaawhl:说的有道理,这里的重点是"编译期",这说明只要编译期不出错,运行时同样不会抛出异常,这要求必须按这样写,否则也不会出错.但有没有"鱼和熊撑"可以兼得的方法呢,6.0版本不知是否解决了(也许为了"鱼",在这里,还不得不舍去"熊撑",--你给的这篇文章也看过了,这人说的也有道理,Java选择了"鱼",C#则选择了"熊撑",但我认为使用Java只要注意,"熊撑"也是可取得,C#像是不行哦.但从另一个角度,C#比Java要求更为严格,可以避免这种错误的产生). 通过这个新的特性,我们可以看到Java中extends关键字的语义发生了稍微的变化用在"泛型"上时,就像C#中的new关键字一样,以后也许越来越多的关键字的语义有多重意思,神经!,跑题了!(费话),你的看法如何? |
|
返回顶楼 | |
发表时间:2006-08-23
riss 写道 熊撑
五笔输入法? riss 写道 费话
拼音输入法? (或者,就认为是 费,而不是 废。) |
|
返回顶楼 | |
发表时间:2006-08-23
你猜去吧,E文看多了,中文不会了,打错字难免,给了你老大道个歉就是了,我用的是"极品"输入法,你用过没有,哈哈!
"熊掌","废话",有错就改,...! |
|
返回顶楼 | |
发表时间:2006-08-23
看看tiger5高手秘籍 200来页,还是中文的。一看都明白了。
|
|
返回顶楼 | |
发表时间:2006-08-23
dogstar 写道 看看tiger5高手秘籍 200来页,还是中文的。一看都明白了。
兄弟,你说的tiger5高手秘籍,我怎么google不到呢?不是打错字了吧? |
|
返回顶楼 | |
发表时间:2006-08-23
楼上说的是,
O'Reilly:Java 5.0 Tiger程序高手秘笈Java 5.0 Tiger: A Developer's Notebook ------------- 总结了一下Java Generic Type Erasure实现原理。 http://forum.iteye.com/viewtopic.php?p=133195 ------------- 搜索了一下,极品输入法,就是五笔输入法的一种。 |
|
返回顶楼 | |
发表时间:2006-08-23
buaawhl 写道 楼上说的是,
O'Reilly:Java 5.0 Tiger程序高手秘笈Java 5.0 Tiger: A Developer's Notebook ------------- 总结了一下Java Generic Type Erasure实现原理。 http://forum.iteye.com/viewtopic.php?p=133195 ------------- 搜索了一下,极品输入法,就是五笔输入法的一种。 这位仁兄,有意思,看了你写的贴子,我认为http://www-128.ibm.com/developerworks/edu/j-dw-java-generics-i.html这个写的不错,如果你的英语比较好的话,翻译一下,共大家学习!我代大家先谢谢你了,呵呵!我的英语好的话我就翻译了,可我连一级都没过过,可想而知(翻译出来大家一定给我扔砖块,哈哈) |
|
返回顶楼 | |