<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    風人園

    弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
    隨筆 - 99, 文章 - 181, 評論 - 56, 引用 - 0
    數據加載中……

    jdk1.5 generic

    老虎來了,你準備好了嗎?

    也不知什么時候,Sun推出了Tiger的Beta版(J2SE 1.5.0 Beta 1).
    早在Sun公布Tiger草案時,就對它是又愛又恨,一下子加了那么多得編程特性( http://www.chinaunix.net/forum/viewtopic.php?t=104044 ),真不知道會不會適應不過來.不過,所謂"兵來將擋",不入虎穴,焉得虎子,請大家與我一起進入"Tiger"的世界.

    1.下載及安裝
    第一步當然就是把老虎請到我們的家中來咯.
    先到http://java.sun.com, 或者 http://java.sun.com/j2se/1.5.0/index.jsp ,就可以發現在右側Popular Downloads里的赫然就是我們要找的"Tiger",點擊進入 http://java.sun.com/j2se/1.5.0/download.jsp ,點擊SDK 下面的download,同意協議,再選擇相應的平臺,windowns 48M,Sparc64只需要9M,點擊下載,或者可以直接右鍵使用Flashget/Netant下載.
    呵呵,記得回到 http://java.sun.com/j2se/1.5.0/download.jsp 同時把Docment也給download下來.

    下載完畢就可以開始安裝了,當然,安裝前先看看Installation Notes,Window下的沒什么特別,solaris64好像還需要打patch.
    我用的是windows,運行下載的文件(用flashget下載的好像需要改擴展名為.exe),跟著wizard往下走,默認安裝路徑是 C:\Program Files\Java\j2sdk1.5.0\,如果你和我一樣討厭空格,可以把它放在C:\j2sdk1.5.0,中間的安裝步驟就不用說了,十幾二十分鐘,安裝就完成了.把下載來的docment也順便給解開,放在C:\j2sdk1.5.0\doc下.

    2.環境配置
    安裝完畢之后,就需要配置一下環境,改動一下兩個環境變量
    JAVA_HOME=c:\j2sdk1.5.0
    PATH=c:\j2sdk1.5.0\bin;......(原來的PATH)

    3.Hello World
    好了,現在Tiger已經在電腦里安了身了.下面,我們就開始我們的騎虎之旅吧.

    正如 http://www.chinaunix.net/forum/viewtopic.php?t=104044 里提到的,java語言規范(JSR)201有不少變化.其中,在集合的Frame里有幾個重要的變化,讓我們以這幾個變化中的 [color=blue]generic [/color]開始展開騎虎之旅.


    generic指的就是對特定的集合,只能容納特定的類的對象,而在取出來時不需做Cast.他的語法類似
    [code]
    Vector<String>; v = new Vector<String>;();
    c.add("test");
    String s = c.get("test");
    [/code]
    我們就以上面的代碼為例
    [code]
    //GenricTest.java
    import java.util.*;
    public class GenricTest{
    public static void main(String args[]){
    Vector<String>; v = new Vector<String>;();
    v.add("Hello World");
    String s = v.get(0);
    System.out.println(s);
    }
    }
    [/code]
    保存,javac之......
    卻出現了這個
    [code]
    GenricTest.java:4: '(' or '[' expected
    Vector<String>; v = new Vector<String>;();
    ? ?? ?? ?? ?? ?? ?? ?? ?? ???^
    1 error
    [/code]

    怎么回事?呵呵明天回來告訴你.
    :)


    昨天說到javac竟然不能編譯新語法的java文件,難道是環境每設對,先來試驗一下java
    [code]
    java -version
    java version "1.5.0-beta"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-bet
    Java HotSpot(TM) Client VM (build 1.5.0-beta-b32c, mixed mode)
    [/code]
    java沒問題,也就是說路徑設置正確了
    那試試javac
    [code]
    Usage: javac <options>; <source files>;
    where possible options include:
    ??-g? ?? ?? ?? ?? ?? ?? ?? ?Generate all debugging info
    ??-g:none? ?? ?? ?? ?? ?? ? Generate no debugging info
    ??-g:{lines,vars,source}? ? Generate only some debugging info
    ??-nowarn? ?? ?? ?? ?? ?? ? Generate no warnings
    ??-verbose? ?? ?? ?? ?? ?? ?Output messages about what the compiler is doing
    ??-deprecation? ?? ?? ?? ???Output source locations where deprecated APIs are used
    ??-classpath <path>;? ?? ?? ?Specify where to find user class files
    ??-sourcepath <path>;? ?? ???Specify where to find input source files
    ??-bootclasspath <path>;? ???Override location of bootstrap class files
    ??-extdirs <dirs>;? ?? ?? ???Override location of installed extensions
    ??-d <directory>;? ?? ?? ?? ?Specify where to place generated class files
    ??-encoding <encoding>;? ?? ?Specify character encoding used by source files
    ??-source <release>;? ?? ?? ?Provide source compatibility with specified release
    ??-target <release>;? ?? ?? ?Generate class files for specific VM version
    ??-help? ?? ?? ?? ?? ?? ?? ?Print a synopsis of standard options
    [/code]
    呵呵,看出來了嗎,原來有一個-source <release>; 的選項,是指定source compatibility (源代碼兼容)一直都沒怎么注意,想必是這里出錯了.
    OK,讓我們再來javac一把
    [code]
    javac -source 1.5??GenricTest.java

    [/code]
    什么都沒提示,那就繼續運行 java
    [code]
    java GenricTest

    Hello World
    [/code]
    好了,夢寐以求的Hello World終于展現在我們面前了.我們已經成功的爬上了虎背.
    4,貓和狗
    Genric 當然沒那么簡單,它的重點在于只容納特定類的對象.如果你讀過關于集合是如何不管放進去的對象的,你也許會記得有著么一個例子(或者類似的)

    [quote]
    ....
    我們往Vector里放進去了幾只貓,雖然我們很清楚,這個Vector應該只有貓,但是,編譯器并不提供任何的保障,一個疏忽,可能會使我們不小心就往里面扔進去一條狗
    .....
    [/quote]
    那么,讓我們看看,Genric是如何防止往一個給貓設計的List扔進去一條狗的,下面的例子有點復雜.

    [code]
    //GenricTestCatAndDog.java

    import java.util.*;
    class Cat {
    String name;
    public Cat(){}
    public Cat(String name){
    this.name=name;
    }
    public void catchMouse(){
    //...
    }
    }
    class Dog{
    String name;
    public Dog(){}
    public Dog(String name){
    this.name=name;
    }
    public void bark(){
    //...
    }
    }
    public class GenricTestCatAndDog{
    public static void main(String args[]){
    Vector<Cat>; v = new Vector<Cat>;();
    Cat cat = new Cat("Jacky");
    Dog dog = new Dog("Mike");
    v.add(cat);
    v.add(dog);
    System.out.println(v.get(0));
    System.out.println(v.get(1));
    }
    }[/code]
    保存,再javac之
    [code]
    javac -source 1.5 GenricTestCatAndDog.java

    GenricTestCatAndDog.java:30: cannot find symbol
    symbol??: method add(Dog)
    location: class java.util.Vector<Cat>;
    v.add(dog);
    ^
    1 error
    [/code]

    正如我們所看到的,dog不能被放到Vector<Cat>;里面.
    我們試著把放進去Dog的代碼注釋掉,再編譯,通過了.
    現在貓可以高高興興的在自己的窩里睡覺,不用擔心狗跑來騷擾了.而我們從貓窩里抓出來得動物,也不用再去檢查一下是否是貓,直接就可以命令他去抓老鼠(catchMouse)了
    [code]
    //GenricTestCatAndDog2.java

    import java.util.*;
    class Cat {
    String name;
    public Cat(){}
    public Cat(String name){
    this.name=name;
    }
    public void catchMouse(){
    System.out.println((name==null?"I am ":name+" is ")+" catching mouse.... ");
    //...
    }
    }
    class Dog{
    String name;
    public Dog(){}
    public Dog(String name){
    this.name=name;
    }
    public void bark(){
    //...
    }
    }
    public class GenricTestCatAndDog2{
    public static void main(String args[]){
    Vector<Cat>; v = new Vector<Cat>;();
    Cat cat = new Cat("Jacky");
    Dog dog = new Dog("Mike");
    v.add(cat);
    //v.add(dog);
    v.get(0).catchMouse();
    }
    }
    [/code]
    編譯并運行
    [code]
    javac -source 1.5 GenricTestCatAndDog2.java

    java??GenricTestCatAndDog2
    Jacky is??catching mouse....
    [/code]

    讓我們先休息一下,好好看看我們的貓捉會老鼠,明天回來,繼續騎虎之旅.....

    Genric兼容性

    我們已經見識了Genric帶來的好處,特定Collection/Map只能容納特定類型的對象,取出來時不需要Cast.
    但是,我們畢竟需要使用以前的某些程序.那么,新語法對以前的代碼有沒有影響呢.讓我們用新的javac編譯一下以前的這一段代碼:
    [code]
    //GenricTest2.java
    import java.util.*;
    public class GenricTest2{
    public static void main(String args[]){
    Vector v = new Vector();
    v.add("Helo World");
    String s = (String)v.get(0);
    System.out.println(s);
    }
    }
    [/code]

    [code]
    javac -source 1.5 GenricTest2.java

    Note: GenricTest2.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.

    [/code]
    ok,javac的內部參數都出來了,繼續編譯
    [code]
    javac -source 1.5 -Xlint:unchecked GenricTest2.java

    GenricTest2.java:5: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.Vector
    v.add("Helo World");
    ^
    1 warning
    [/code]
    看出來了,這就象以前的 -deprecation 參數,給你一些提示.當然,原來的代碼還是能繼續使用的.??

    創建自己的Genric類

    根據前面的介紹,對于Genric,大家應該已經有所了解.那么,我們能不能創建自己的包含Genric特性的類呢?
    讓我們去看看Vector.java的源代碼,看看它是如何做到的.然后,我們就可以依樣畫葫蘆了;
    大家都知道,jsdk發布時,通常都附帶源代碼.打開C:\j2sdk1.5.0,src.zip就放在那里,解開,打開java\util\Vector.java.

    源碼挺長,我就只列出它的重要部分(類定義,默認構造函數,add方法)
    [quote]
    ....
    public class Vector<E>;
    ? ? extends AbstractList<E>;
    ? ? implements List<E>;, RandomAccess, Cloneable, java.io.Serializable
    .....
    public Vector() {
    ? ? ? ? this(10);
    ? ? }
    ? ? public Vector(int initialCapacity) {
    ? ? ? ? this(initialCapacity, 0);
    ? ? }
    ? ?public Vector(int initialCapacity, int capacityIncrement) {
    ? ?super();
    ? ?...
    ? ? ? ? public void add(E o) {
    ? ?? ?? ?? ?checkForComodification();

    ? ? ? ?? ???try {
    ? ? ? ? ? ? ? ? AbstractList.this.add(cursor++, o);
    ? ? ? ? ? ? ? ? lastRet = -1;
    ? ? ? ? ? ? ? ? expectedModCount = modCount;
    ? ? ? ?? ???} catch(IndexOutOfBoundsException e) {
    ? ? ? ? ? ? ? ? throw new ConcurrentModificationException();
    ? ? ? ?? ???}
    ? ? ? ? }
    ? ? }
    ....
    )
    [/quote]
    當然,還得看看它的父類(AbstractList)以及祖父類(AbstractCollection),它們的默認構造函數都是空白.
    同時,可以看到,add方法出現了"<E>;"里的E.

    ok,畫一個葫蘆先

    [code]
    //MyGenricGun.java
    //子彈
    class Bulltin
    {
    ? ? ? ? int damage;
    ? ? ? ? public Bulltin(){};
    };
    //普通子彈
    class SmallBulltin extends Bulltin
    {
    ? ? ? ?
    ? ? ? ? public SmallBulltin(){damage=10;};
    };
    //火箭炮
    class Rocket extends Bulltin
    {
    ? ? ? ? public Rocket(){damage=2000;};
    };

    //可以指定放子彈類型的Gun
    public class MyGenricGun<MyType extends Bulltin>;{

    //上子彈
    public void addBulltin(MyType bulletin){
    ? ? ? ? System.out.println("add a bulletin,damage is " + bulletin.damage);
    //....
    }

    public static void main(String args[]){
    //放小子彈的槍
    MyGenricGun<SmallBulltin>; gun1 = new? ?MyGenricGun<SmallBulltin>;();
    //放火箭炮的槍
    MyGenricGun<Rocket>; gun2 = new? ?MyGenricGun<Rocket>;();
    //什么子彈都能放的槍
    MyGenricGun<Bulltin>; gun3 = new? ?MyGenricGun<Bulltin>;();
    //什么都能放的槍
    MyGenricGun gun4 = new? ?MyGenricGun();
    //什么都能放的槍
    //MyGenricGun<Object>; gun5 = new? ?MyGenricGun<Object>;();//不成功
    gun1.addBulltin(new SmallBulltin());
    //gun1.addBulltin(new Rocket());//不成功
    //gun2.addBulltin(new SmallBulltin());//不成功
    gun2.addBulltin(new Rocket());
    gun3.addBulltin(new Bulltin());
    gun3.addBulltin(new Rocket());
    gun3.addBulltin(new SmallBulltin());
    gun4.addBulltin(new SmallBulltin());
    gun4.addBulltin(new Rocket());
    gun4.addBulltin(new Bulltin());
    //gun4.addBulltin(new Integer(1));//不成功
    }

    }
    [/code]

    大家可以把標有"http://不成功"的地方的注釋去掉/加上,對比一下編譯結果,就可以大概知道Genric的運行邏輯了.

    自己再琢磨琢磨,看看java.util里的Colletion及Map FrameWork里的包,Genric暫時就說到這里.

    下周,將為大家繼續帶來 Tiger的其他新特性(Auto Boxing unBoxing,Enhanced for loop,Enumerated types等)

    posted on 2006-12-16 15:45 風人園 閱讀(415) 評論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 亚洲 欧洲 日韩 综合在线| 免费中文字幕在线| 免费H网站在线观看的| 57pao一国产成永久免费| 少妇太爽了在线观看免费视频| 国产午夜无码精品免费看动漫| 中文字幕无码免费久久9一区9 | 亚洲AV无码一区二区三区在线观看| 亚洲欧洲另类春色校园网站| 国产特级淫片免费看| 免费大片av手机看片高清| 中文字幕看片在线a免费| 天天综合亚洲色在线精品| 免费无遮挡无遮羞在线看| 一级毛片一级毛片免费毛片| 国产免费播放一区二区| 99在线视频免费观看| 四虎国产精品永久免费网址| 99精品一区二区免费视频| 精品国产污污免费网站aⅴ| 日韩国产免费一区二区三区| 久久久久国色AV免费观看性色| 韩国二级毛片免费播放| 内射无码专区久久亚洲| 国产亚洲精品拍拍拍拍拍| 亚洲国产成人一区二区三区| 亚洲精品亚洲人成在线观看麻豆 | 日本人护士免费xxxx视频| 国产91久久久久久久免费| 亚洲熟妇av一区二区三区漫画| 亚洲AV日韩精品久久久久| 亚洲特级aaaaaa毛片| 在线精品自拍亚洲第一区| 99re6在线视频精品免费| 亚洲免费中文字幕| 四虎永久免费网站免费观看| 亚洲精品中文字幕无码蜜桃| 亚洲国产日产无码精品| 小说区亚洲自拍另类| 久久久久久国产精品免费免费男同 | 国产亚洲精品观看91在线|