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