Java泛型使用延伸

jopen 11年前發布 | 23K 次閱讀 泛型 Java開發

泛型使用延伸

當創建了帶泛型聲明的接口,父類之后,可以為該接口創建實現類,或從該父類來派生子類,但值得指出的是,當使用這些接口,父類時不能再包含類型形參。下面代碼是錯誤的:

Public class A extendsApple<T>{}

代碼可以改為:

public classRedApple extends Apple<String>{

 

}

如果使用Apple類時沒有傳入實際的類型參數,Java編譯器可能發出警告:使用了未經檢查或不安全的操作――這就是泛型檢查的警告。可以通過為Javac命令增加-Xlint:unchecked選項來看到詳細提示。

不管泛型類型的實際類型參數是什么,它們在運行時總有同樣的類(class),并沒有生成新的class文件,也不會當作新類來處理。

public static voidmain(String[] args){

          Apple<String> a1 = newApple<String>("Apple");

          System.out.println(a1.getInfo());

          Apple<Double> a2 = newApple<Double>(2.00);

          System.out.println(a2.getInfo());

          System.out.println(a1.getClass()==a2.getClass());

      }

Output:

Apple

2.0

True

泛型對其所有可能的類型參數,都具有同樣的行為,從而可以把相同的類當成許多哦不同的類來處理。類的靜態變量和方法也在所有的實例間共享,所以在靜態方法,靜態初始化或者靜態變量的聲明和初始化中不允許使用類型形參,instanceof也是一樣不能跟形參。

如果使用泛型,只要代碼在編譯時沒有出現警告,就不會遇到運行時ClasCastException.

為了表示各種泛型List的父類,我們需要使用類型通配符 – 問號(?), 問號作為類型實參傳給List集合,寫作Collection<?>,意思是未知類型元素的List。這樣不管使用任何類型的 Collection來調用它,都是安全的,因為類型是Object.

import java.awt.Canvas;

 

public abstract class Shape {

    public abstract void draw(Canvas c);

}

 

public classCircle extends Shape{

 

    @Override

    public voiddraw(Canvas c) {

       // TODO Auto-generated method stub

       System.out.println("Circle "+c);

    }

    

}

public classRectangle extends Shape{

 

    @Override

    public voiddraw(Canvas c) {

       // TODO Auto-generated method stub

       System.out.println("Rectangle "+c);

    }

 

}

import java.util.List;

 

public classCanvas {

       public voiddrawAll(List<?> shapes){

           for(Objectobj : shapes){

              Shape s =(Shape)obj;

           }

       }

}

支持泛型的方法:

import java.util.ArrayList;

import java.util.Collection;

 

 

public classTestGenericMethod {

     static<T>voidfromArrayToCollection(T[] a, Collection<T> c){

         for(To:a){

            c.add(o);

         }

         System.out.println(c.size());

     }

     public static voidmain(String[] args){

         Object[] oa = newObject[100];

         Collection<Object>co = new ArrayList<Object>();

         fromArrayToCollection(oa,co);

         String[] str = newString[200];

         Collection<Object>co1 = new ArrayList<Object>();

         fromArrayToCollection(str,co1);

         Double[] dou = newDouble[200];

         Collection<Object>co2 = new ArrayList<Object>();

         fromArrayToCollection(dou,co2);

         Integer[] Inte = newInteger[100];

         Collection<Object>co3 = new ArrayList<Object>();

         fromArrayToCollection(Inte,co3);

     }

}

Output:

100

200

200

100

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!