<h1><span lang="en-us">why</span><span>,java为什么需要泛型?</span></h1>
<h1><span lang="en-us">how</span><span>,擦除,一种折中方案</span></h1><p class="msonormal"><span>泛型其实算不上是一种语言特性,它只是</span><span lang="en-us">java</span><span>实现泛型技术的一种折中,至于为什么选择擦除,我猜可能是为了保持向后兼容,使得泛型代码和非泛型代码能够共存。为了保持向后兼容,泛型对</span><span lang="en-us">jvm</span><span>是不可见的,也就是</span><span lang="en-us">jvm</span><span>根本不需要做很多变化,因为既然你实现泛型的主要目标是提供编译时期的类型检查安全,那么很多工作都应该在编译时期做,实际上也是这样的,擦除也就是这么一个原理,在运行时期看不见任何泛型参数,</span><span lang="en-us">jvm</span><span>执行泛型代码就像执行以前的普通代码一样!(当然不做任何改变也是不可能的,可以参考</span><span lang="en-us">[url=http://icyfenix.iteye.com/blog/1021949]http://icyfenix.iteye.com/blog/1021949[/url]</span><span>)。</span>
list<string > list = new arrarylist<string>();list.add(“cantellow”);int integer = list.get(0);//compile error
<span>然后,将参数化类型中的类型参数</span><span lang="en-us">"</span><span>擦除</span><span lang="en-us">"</span><span>(</span><span lang="en-us">erasure</span><span>)掉,并且将类型变量用</span><span lang="en-us">"</span><span>上限(</span><span lang="en-us">upper bound</span><span>)</span><span lang="en-us">"</span><span>取代,通常情况下这些上限是</span><span lang="en-us"> object</span><span>。这里的类型变量是指实例域,本地方法域,方法参数以及方法返回值中用来标记类型信息的</span><span lang="en-us">"</span><span>变量</span><span lang="en-us">"</span><span>,例如:实例域中的变量声明</span><span lang="en-us"> a elem;</span><span>,方法声明</span><span lang="en-us"> node (a elem){};</span><span>,其中,</span><span lang="en-us">a </span><span>用来标记</span><span lang="en-us"> elem </span><span>的类型,它就是类型变量。</span>
<p class="msonormal"><span lang="en-us"> </span>
list<integer> li = new arraylist<integer>(); list<number> ln = li; // illegal ln.add(new float(3.1415));
<span>因为</span><span lang="en-us"> ln</span><span>是</span><span lang="en-us"> list<number></span><span>,所以向其添加</span><span lang="en-us"> float</span><span>似乎是完全合法的。但是如果</span><span lang="en-us"> ln</span><span>是</span><span lang="en-us"> li</span><span>的别名,那么这就破坏了蕴含在</span><span lang="en-us"> li</span><span>定义中的类型安全承诺</span><span lang="en-us"> —— </span><span>它是一个整数列表,这就是泛型类型不能协变的原因。</span>
<h2><span>获取泛型类型</span></h2><p class="msonormal"><span>更多信息可以参考讨论:</span><span lang="en-us">[url=http://www.iteye.com/topic/585900]http://www.iteye.com/topic/585900[/url]</span>