论坛首页 Java企业应用论坛

关于"泛型"实践中发现的问题!

浏览 3318 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-08-22  
说实话,这还真得感谢hongliang兄弟提的问题:http://forum.iteye.com/viewtopic.php?t=21933
我以前一直用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做的不够好,还是我理解有问题)?大家说说呢?

也许刚看了这么多文章,脑袋不清醒了吧,不过还是请大家先发表下自己的见解,我今天回去清醒清醒下,明日,再和大家讨论!
   发表时间: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>()
0 请登录后投票
   发表时间:2006-08-22  
Java Generic的目的是编译期类型检查。
Java Generic的实现方法是Type Erasure,编译结果里面并没有保留具体类型信息,就是说,运行期不进行类型检查。
楼主的第一段代码运行可以通过。

c# 2.0以上的Generic的实现方案不是Type Erasure,而是Reification 类型具体化 -- 编译结果保留了Generic类型信息,从而可以运行时类型检查,Reflection获取Generic类型信息。当然,c#也就不支持wildcard -- &lt;?&gt;。
http://gafter.blogspot.com/2004/09/puzzling-through-erasure-answer.html
0 请登录后投票
   发表时间:2006-08-23  
To 温柔一刀:运行时可以通过,你可以试试哈!
To buaawhl:说的有道理,这里的重点是"编译期",这说明只要编译期不出错,运行时同样不会抛出异常,这要求必须按这样写,否则也不会出错.但有没有"鱼和熊撑"可以兼得的方法呢,6.0版本不知是否解决了(也许为了"鱼",在这里,还不得不舍去"熊撑",--你给的这篇文章也看过了,这人说的也有道理,Java选择了"鱼",C#则选择了"熊撑",但我认为使用Java只要注意,"熊撑"也是可取得,C#像是不行哦.但从另一个角度,C#比Java要求更为严格,可以避免这种错误的产生).

通过这个新的特性,我们可以看到Java中extends关键字的语义发生了稍微的变化用在"泛型"上时,就像C#中的new关键字一样,以后也许越来越多的关键字的语义有多重意思,神经!,跑题了!(费话),你的看法如何?
0 请登录后投票
   发表时间:2006-08-23  
riss 写道
熊撑

五笔输入法?

riss 写道
费话

拼音输入法?

(或者,就认为是 费,而不是 废。)
0 请登录后投票
   发表时间:2006-08-23  
你猜去吧,E文看多了,中文不会了,打错字难免,给了你老大道个歉就是了,我用的是"极品"输入法,你用过没有,哈哈!
"熊掌","废话",有错就改,...!
0 请登录后投票
   发表时间:2006-08-23  
看看tiger5高手秘籍 200来页,还是中文的。一看都明白了。
0 请登录后投票
   发表时间:2006-08-23  
dogstar 写道
看看tiger5高手秘籍 200来页,还是中文的。一看都明白了。


兄弟,你说的tiger5高手秘籍,我怎么google不到呢?不是打错字了吧?
0 请登录后投票
   发表时间: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

-------------

搜索了一下,极品输入法,就是五笔输入法的一种。
0 请登录后投票
   发表时间: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这个写的不错,如果你的英语比较好的话,翻译一下,共大家学习!我代大家先谢谢你了,呵呵!我的英语好的话我就翻译了,可我连一级都没过过,可想而知(翻译出来大家一定给我扔砖块,哈哈)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics