﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-纸飞机-文章分类-JAVA</title><link>http://www.blogjava.net/jxhkwhy/category/22895.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 29 May 2007 22:04:26 GMT</lastBuildDate><pubDate>Tue, 29 May 2007 22:04:26 GMT</pubDate><ttl>60</ttl><item><title>JAVA泛型QUIK START</title><link>http://www.blogjava.net/jxhkwhy/articles/120784.html</link><dc:creator>纸飞机</dc:creator><author>纸飞机</author><pubDate>Tue, 29 May 2007 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/jxhkwhy/articles/120784.html</guid><wfw:comment>http://www.blogjava.net/jxhkwhy/comments/120784.html</wfw:comment><comments>http://www.blogjava.net/jxhkwhy/articles/120784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jxhkwhy/comments/commentRss/120784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jxhkwhy/services/trackbacks/120784.html</trackback:ping><description><![CDATA[<h1 style="margin: 17pt 0cm 16.5pt;" align="center"><a name="_Toc94896531"><span lang="EN-US">JAVA</span></a><span><span style="font-family: 宋体;">泛型</span><span lang="EN-US">QUIK START</span></span></h1>
<span style="line-height: 150%; font-family: 宋体;" lang="EN-US">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;" align="right">作者（KaedeV）<br><br>&nbsp;&nbsp; JDK1.5 </p>
</span><span style="line-height: 150%; font-family: 宋体;">令我们期待很久<span lang="EN-US">,</span>可是当他发布的时候却更换版本号为<span lang="EN-US">5.0</span>。这说明<span lang="EN-US">JAVA</span>已经有大幅度的变化<span lang="EN-US">.</span>本文将讲解<span lang="EN-US">JDK5.0</span>支持的新功能<span lang="EN-US">-----JAVA</span>的泛型<span lang="EN-US">.</span></span>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm;"><a name="_Toc94896532"><span lang="EN-US"><span><font face="Arial">1.1.</font><span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US"><font face="Arial">JAVA</font></span></a><span><span style="font-family: 宋体;">泛型</span></span></h2>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">其实</span><span lang="EN-US">JAVA</span><span style="font-family: 宋体;">的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样，方法是这样的</span><span lang="EN-US">method(String str1,String str2 ),</span><span style="font-family: 宋体;">方法中参数</span><span lang="EN-US">str1</span><span style="font-family: 宋体;">、</span><span lang="EN-US">str2</span><span style="font-family: 宋体;">的值是可变的。而泛型也是一样的，这样写</span><span lang="EN-US">class Java_Generics&lt;K,V&gt;</span><span style="font-family: 宋体;">，这里边的</span><span lang="EN-US">K</span><span style="font-family: 宋体;">和</span><span lang="EN-US">V</span><span style="font-family: 宋体;">就象方法中的参数</span><span lang="EN-US">str1</span><span style="font-family: 宋体;">和</span><span lang="EN-US">str2,</span><span style="font-family: 宋体;">也是可变。下面看看例子：</span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">//code list 1</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">import java.util.Hashtable;</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">class TestGen0&lt;K,V&gt;{</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp; </span>public Hashtable&lt;K,V&gt; h=new Hashtable&lt;K,V&gt;();</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp; </span>public void put(K k, V v) {<span>&nbsp;&nbsp; </span></font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>h.put(k,v);</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">public V get(K k) {</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return h.get(k);</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">public static void main(String args[]){</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 39.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">TestGen0&lt;String,String&gt; t=new TestGen0&lt;String,String&gt;();</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 39.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">t.put("key", "value");</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 39.25pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">String s=t.get("key");</span><span lang="EN-US"> <o:p></o:p></span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 39.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">System.out.println(s);</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 0cm;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">正确输出</span><span lang="EN-US">:value</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="line-height: 150%; font-family: 宋体;">这只是个例子（</span><span style="line-height: 150%;" lang="EN-US">JAVA</span><span style="line-height: 150%; font-family: 宋体;">中</span><span style="color: black; line-height: 150%; font-family: 宋体;">集合框架</span><span style="line-height: 150%; font-family: 宋体;">都泛型化了，这里费了</span><span style="line-height: 150%;" lang="EN-US">2</span><span style="line-height: 150%; font-family: 宋体;">遍事</span><span style="line-height: 150%; font-family: wingdings;" lang="EN-US"><span>J</span></span><span style="line-height: 150%; font-family: 宋体;">），不过看看是不是创建一个用类型作为参数的类</span><span style="line-height: 150%; font-family: 宋体;">，参数是<span lang="EN-US">K</span>，<span lang="EN-US">V</span>，传入的&#8220;值&#8221;是<span lang="EN-US">String</span>类型</span><span style="line-height: 150%; font-family: 宋体;">。这个类他没有特定的待处理型别，以前我们定义好了一个类，在<u><span style="color: red;">输入输入</span></u>参数有所固定，是什么型别的有要求，但是现在编写程序，完全可以不制定参数的类型，具体用的时候来确定，增加了程序的通用性，像是一个模板。呵呵，类似</span><span style="line-height: 150%;" lang="EN-US">C++</span><span style="line-height: 150%; font-family: 宋体;">的模板（类似）。</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt;"><a name="_Toc94896533"><span lang="EN-US"><span><font size="5">1.1.1.</font><span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;"><font size="5">泛型通配符</font></span></a></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="line-height: 150%; font-family: 宋体;">下面我们先看看这些程序：</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">//</span><span lang="EN-US">Code list 2</span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">void TestGen0Medthod1(List l) { </font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp; </span>for (Object o : l) </font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>System.out.println(o); </font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="line-height: 150%; font-family: 宋体;">看看这个方法有没有异议，这个方法会通过编译的，假如你传入</span><span style="line-height: 150%;" lang="EN-US">String</span><span style="line-height: 150%; font-family: 宋体;">，就是这样</span><span style="line-height: 150%;" lang="EN-US">List&lt;String&gt;</span><span style="line-height: 150%; font-family: 宋体;">。接着我们调用它</span><span style="line-height: 150%;" lang="EN-US">,</span><span style="line-height: 150%; font-family: 宋体;">问题就出现了，我们将一个</span><span style="line-height: 150%;" lang="EN-US">List&lt;String&gt;</span><span style="line-height: 150%; font-family: 宋体;">当作</span><span style="line-height: 150%;" lang="EN-US">List</span><span style="line-height: 150%; font-family: 宋体;">传给了方法，</span><span style="line-height: 150%;" lang="EN-US">JVM</span><span style="line-height: 150%; font-family: 宋体;">会给我们一个警告，说这个破坏了类型安全，因为从</span><span style="line-height: 150%;" lang="EN-US">List</span><span style="line-height: 150%; font-family: 宋体;">中返回的都是</span><span style="line-height: 150%;" lang="EN-US">Object</span><span style="line-height: 150%; font-family: 宋体;">类型的，而让我们再看看下面的方法。</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">//</span><span lang="EN-US">Code list 3</span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">void TestGen0Medthod1(List&lt;String&gt; l) { </font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp; </span>for (Object o : l) </font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>System.out.println(o); </font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="line-height: 150%; font-family: 宋体;">因为这里的</span><span style="line-height: 150%;" lang="EN-US">List&lt;String&gt;</span><span style="line-height: 150%; font-family: 宋体;">不是</span><span style="line-height: 150%;" lang="EN-US">List&lt;Object&gt;</span><span style="line-height: 150%; font-family: 宋体;">的子类</span><span style="line-height: 150%;" lang="EN-US">,</span><span style="line-height: 150%; font-family: 宋体;">不是</span><span style="line-height: 150%;" lang="EN-US">String</span><span style="line-height: 150%; font-family: 宋体;">与</span><span style="line-height: 150%;" lang="EN-US">Object</span><span style="line-height: 150%; font-family: 宋体;">的关系，就是说</span><span style="line-height: 150%;" lang="EN-US">List&lt;String&gt;</span><span style="line-height: 150%; font-family: 宋体;">不隶属于</span><span style="line-height: 150%;" lang="EN-US">list&lt;Object&gt;,</span><span style="line-height: 150%; font-family: 宋体;">他们不是继承关系，所以是不行的，这里的</span><span style="line-height: 150%;" lang="EN-US">extends</span><span style="line-height: 150%; font-family: 宋体;">是表示限制的。</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="line-height: 150%; font-family: 宋体;">类型通配符是很神奇的，</span><span style="line-height: 150%;" lang="EN-US">List&lt;?&gt;</span><span style="line-height: 150%; font-family: 宋体;">这个你能为他做什么呢</span><span style="line-height: 150%;" lang="EN-US">?</span><span style="line-height: 150%; font-family: 宋体;">怎么都是&#8220;？&#8221;，它似乎不确定，他总不能返回一个？作为类型的数据吧，是啊他是不会返回一个&#8220;？&#8221;来问程序员的？</span><span style="line-height: 150%;" lang="EN-US">JVM</span><span style="line-height: 150%; font-family: 宋体;">会做简单的思考的，看看代码吧，更直观些。</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">//</span><span lang="EN-US">code list 4</span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">List&lt;String&gt; l1 = new ArrayList&lt;String&gt;();</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">li.add(&#8220;String&#8221;);</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">List&lt;?&gt; l2 = l1;</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">System.out.println(l1.get(0));</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="line-height: 150%; font-family: 宋体;">这段代码没问题的，</span><span style="line-height: 150%;" lang="EN-US">l1.get(0)</span><span style="line-height: 150%; font-family: 宋体;">将返回一个</span><span style="line-height: 150%;" lang="EN-US">Object</span><span style="line-height: 150%; font-family: 宋体;">。</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt;"><a name="_Toc94896534"><span lang="EN-US"><span><font size="5">1.1.2.</font><span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;"><font size="5">编写泛型类要注意：</font></span></a></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 54.75pt; text-indent: -33.75pt;"><span lang="EN-US"><span>1、<span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">在定义一个泛型类的时候，在</span> <span style="font-family: 宋体;">&#8220;</span><span lang="EN-US">&lt;&gt;</span><span style="font-family: 宋体;">&#8221;之间定义形式类型参数，例如：&#8220;</span><span lang="EN-US">class TestGen&lt;K, V&gt;</span><span style="font-family: 宋体;">&#8221;，其中&#8220;</span><span lang="EN-US">K</span><span style="font-family: 宋体;">&#8221;</span><span lang="EN-US"> , </span><span style="font-family: 宋体;">&#8220;</span><span lang="EN-US">V</span><span style="font-family: 宋体;">&#8221;不代表值，而是表示类型。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 54.75pt; text-indent: -33.75pt;"><span lang="EN-US"><span>2、<span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">实例化泛型对象的时候，一定要在类名后面指定类型参数的值（类型），一共要有两次书写。例如：</span><span lang="EN-US">TestGen&lt;String,String&gt; t=new TestGen&lt;String,String&gt;()</span><span style="font-family: 宋体;">；</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 54.75pt; text-indent: -33.75pt;"><span lang="EN-US"><span>3、<span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">泛型中</span><span lang="EN-US">&lt;K extends Object&gt;,extends</span><span style="font-family: 宋体;">并不代表继承，它是类型范围限制。</span></p>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm;"><a name="_Toc94896535"><span lang="EN-US"><span><font face="Arial">1.2.</font><span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">泛型与数据类型转换</span></a></h2>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt;"><a name="_Toc94896536"><span lang="EN-US"><span><font size="5">1.2.1.</font><span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;"><font size="5">消除类型转换</font></span></a></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="line-height: 150%; font-family: 宋体;">上面的例子大家看到什么了，数据类型转换的代码不见了。在以前我们经常要书写以下代码，如：</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">//</span><span lang="EN-US">code list 5</span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">&nbsp;</font></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">import java.util.Hashtable;</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">class Test {</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 39.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">public static void main(String[] args) {</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 57.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">Hashtable h = new Hashtable();</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 57.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">h.put("key", "value");</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 57.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">String s = (String)h.get("key");</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 57.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">System.out.println(s);</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt; text-indent: 39.25pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">}</span><span style="font-size: 10.5pt;" lang="EN-US"><o:p></o:p></span></font></font></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 1cm;"><span style="line-height: 150%; font-family: 宋体;">这个我们做了类型转换，是不是感觉很烦的，并且强制类型转换会带来潜在的危险，系统可能会抛一个</span><span style="line-height: 150%;" lang="EN-US">ClassCastException</span><span style="line-height: 150%; font-family: 宋体;">异常信息。在</span><span style="line-height: 150%;" lang="EN-US">JDK5.0</span><span style="line-height: 150%; font-family: 宋体;">中我们完全可以这么做，如：</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">//</span><span lang="EN-US">code list 6</span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">import java.util.Hashtable;</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">class Test {</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp; </span>public static void main(String[] args) {</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>Hashtable&lt;String,Integer&gt; h = new Hashtable&lt;String,Integer&gt; ();</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>h.put("key", new Integer(123));</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>int s = h.get("key").intValue();</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>System.out.println(s);</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp; </span>}</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">}</span><span lang="EN-US"><o:p></o:p></span></font></font></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="line-height: 150%; font-family: 宋体;">这里我们使用泛化版本的</span><span style="line-height: 150%;" lang="EN-US">HashMap,</span><span style="line-height: 150%; font-family: 宋体;">这样就不用我们来编写类型转换的代码了，类型转换的过程交给编译器来处理，是不是很方便，而且很安全。上面是</span><span style="line-height: 150%;" lang="EN-US">String</span><span style="line-height: 150%; font-family: 宋体;">映射到</span><span style="line-height: 150%;" lang="EN-US">String</span><span style="line-height: 150%; font-family: 宋体;">，也可以将</span><span style="line-height: 150%;" lang="EN-US">Integer</span><span style="line-height: 150%; font-family: 宋体;">映射为</span><span style="line-height: 150%;" lang="EN-US">String</span><span style="line-height: 150%; font-family: 宋体;">，只要写成</span><span style="line-height: 150%;" lang="EN-US">HashTable&lt;Integer,String&gt; h=new HashTable&lt;Integer,String&gt;();h.get(new Integer(0))</span><span style="line-height: 150%; font-family: 宋体;">返回</span><span style="line-height: 150%;" lang="EN-US">value</span><span style="line-height: 150%; font-family: 宋体;">。果然很方便。</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt;"><a name="_Toc94896537"><span lang="EN-US"><span><font size="5">1.2.2.</font><span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;"><font size="5">自动解包装与自动包装的功能</font></span></a></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="line-height: 150%; font-family: 宋体;">从上面有没有看到有点别扭啊，</span><span style="line-height: 150%;" lang="EN-US">h.get(new Integer(123))</span><span style="line-height: 150%; font-family: 宋体;">这里的</span><span style="line-height: 150%;" lang="EN-US">new Integer(123);</span><span style="line-height: 150%; font-family: 宋体;">好烦的，在</span><span style="line-height: 150%;" lang="EN-US">JDK5.0</span><span style="line-height: 150%; font-family: 宋体;">之前我们只能忍着了，现在这种问题已经解决了，请看下面这个方法。我们传入一个</span><span style="line-height: 150%;" lang="EN-US">int</span><span style="line-height: 150%; font-family: 宋体;">这一基本型别，然后再将</span><span style="line-height: 150%;" lang="EN-US">i</span><span style="line-height: 150%; font-family: 宋体;">的值直接添加到</span><span style="line-height: 150%;" lang="EN-US">List</span><span style="line-height: 150%; font-family: 宋体;">中，其实</span><span style="line-height: 150%;" lang="EN-US">List</span><span style="line-height: 150%; font-family: 宋体;">是不能储存基本型别的，</span><span style="line-height: 150%;" lang="EN-US">List</span><span style="line-height: 150%; font-family: 宋体;">中应该存储对象，这里编译器将</span><span style="line-height: 150%;" lang="EN-US">int</span><span style="line-height: 150%; font-family: 宋体;">包装成</span><span style="line-height: 150%;" lang="EN-US">Integer</span><span style="line-height: 150%; font-family: 宋体;">，然后添加到</span><span style="line-height: 150%;" lang="EN-US">List</span><span style="line-height: 150%; font-family: 宋体;">中去。接着我们用</span><span style="line-height: 150%;" lang="EN-US">List.get(0);</span><span style="line-height: 150%; font-family: 宋体;">来检索数据，并返回对象再将对象解包装成</span><span style="line-height: 150%;" lang="EN-US">int</span><span style="line-height: 150%; font-family: 宋体;">。恩，</span><span style="line-height: 150%;" lang="EN-US">JDK5.0</span><span style="line-height: 150%; font-family: 宋体;">给我们带来更多方便与安全。</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">//</span><span lang="EN-US">Code list 7</span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">public void autoBoxingUnboxing(int i) {</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">ArrayList&lt;Integer&gt; L= new ArrayList&lt;Integer&gt;();</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>L.add(i);</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>int a = L.get(0);</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>System.out.println("The value of i is " + a);</span><span lang="EN-US"><o:p></o:p></span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt;"><a name="_Toc94896538"><span lang="EN-US"><span><font size="5">1.2.3.</font><span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;"><font size="5">限制泛型中类型参数的范围</font></span></a></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="line-height: 150%; font-family: 宋体;">也许你已经发现在</span><span style="line-height: 150%;" lang="EN-US">code list 1</span><span style="line-height: 150%; font-family: 宋体;">中的</span><span style="line-height: 150%;" lang="EN-US">TestGen&lt;K,V&gt;</span><span style="line-height: 150%; font-family: 宋体;">这个泛型类</span><span style="line-height: 150%;" lang="EN-US">,</span><span style="line-height: 150%; font-family: 宋体;">其中</span><span style="line-height: 150%;" lang="EN-US">K,V</span><span style="line-height: 150%; font-family: 宋体;">可以是任意的型别。也许你有时候呢想限定一下</span><span style="line-height: 150%;" lang="EN-US">K</span><span style="line-height: 150%; font-family: 宋体;">和</span><span style="line-height: 150%;" lang="EN-US">V</span><span style="line-height: 150%; font-family: 宋体;">当然范围，怎么做呢？看看如下的代码：</span><span style="line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">//</span><span lang="EN-US">Code list 8</span></font></font></font></font></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">class TestGen2&lt;K extents String,V extends Number&gt;</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New">{<span>&nbsp; </span></font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>private V v=null;</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>private K k=null;</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">&nbsp;</font></o:p></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>public void setV(V v){</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.v=v;<span>&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">} </font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">public V getV(){</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return this.v;</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">public void setK(K k){</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.k=k;<span>&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">} </font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">public V getK(){</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return this.k;</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">}</font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font style="background-color: #d9d9d9;" color="#0000ff" face="Courier new" size="2">public static void main(String[] args) </font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{<span>&nbsp; </span></font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TestGen2&lt;String,Integer&gt; t2=new TestGen2&lt;String,Integer&gt;();</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>t2.setK(new String("String"));</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>t2.setV(new Integer(123));</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span>System.out.println(t2.getK());</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(t2.getV());</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>}</font></font></font></font></span></p>
<p class="a" style="margin: 0cm 0cm 0pt;"><font size="2"><font color="#0000ff"><font style="background-color: #d9d9d9;"><font face="Courier New"><span lang="EN-US">}</span><span lang="EN-US"><o:p></o:p></span></font></font></font></font></p>
<span style="line-height: 150%; font-family: 宋体;">上边</span><span style="line-height: 150%;" lang="EN-US">K</span><span style="line-height: 150%; font-family: 宋体;">的范围是</span><span style="line-height: 150%;" lang="EN-US">&lt;=String </span><span style="line-height: 150%; font-family: 宋体;">，</span><span style="line-height: 150%;" lang="EN-US">V</span><span style="line-height: 150%; font-family: 宋体;">的范围是</span><span style="line-height: 150%;" lang="EN-US">&lt;=Number</span><span style="line-height: 150%; font-family: 宋体;">，注意是&#8220;</span><span style="line-height: 150%;" lang="EN-US">&lt;=</span><span style="line-height: 150%; font-family: 宋体;">&#8221;</span><span style="line-height: 150%;" lang="EN-US">,</span><span style="line-height: 150%; font-family: 宋体;">对于</span><span style="line-height: 150%;" lang="EN-US">K</span><span style="line-height: 150%; font-family: 宋体;">可以是</span><span style="line-height: 150%;" lang="EN-US">String</span><span style="line-height: 150%; font-family: 宋体;">的，</span><span style="line-height: 150%;" lang="EN-US">V</span><span style="line-height: 150%; font-family: 宋体;">当然也可以是</span><span style="line-height: 150%;" lang="EN-US">Number</span><span style="line-height: 150%; font-family: 宋体;">，也可以是</span><span style="line-height: 150%;" lang="EN-US">Integer,Float,Double,Byte</span><span style="line-height: 150%; font-family: 宋体;">等。看看下图也许能直观些</span><img src ="http://www.blogjava.net/jxhkwhy/aggbug/120784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jxhkwhy/" target="_blank">纸飞机</a> 2007-05-30 00:24 <a href="http://www.blogjava.net/jxhkwhy/articles/120784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>