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);
}
100
200
200