Java泛型使用延伸

2014-11-24 10:19:03 · 作者: · 浏览: 0

泛型使用延伸
当创建了带泛型声明的接口,父类之后,可以为该接口创建实现类,或从该父类来派生子类,但值得指出的是,当使用这些接口,父类时不能再包含类型形参。下面代码是错误的:
Public class A extendsApple{}
代码可以改为:
public classRedApple extends Apple{

}
如果使用Apple类时没有传入实际的类型参数,Java编译器可能发出警告:使用了未经检查或不安全的操作 这就是泛型检查的警告。可以通过为Javac命令增加-Xlint:unchecked选项来看到详细提示。
不管泛型类型的实际类型参数是什么,它们在运行时总有同样的类(class),并没有生成新的class文件,也不会当作新类来处理。
public static voidmain(String[] args){

Apple a1 = newApple("Apple");

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

Apple a2 = newApple(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 voidfromArrayToCollection(T[] a, Collection c){

for(To:a){

c.add(o);

}

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

}

public static voidmain(String[] args){

Object[] oa = newObject[100];

Collectionco = new ArrayList();

fromArrayToCollection(oa,co);

String[] str = newString[200];

Collectionco1 = new ArrayList();

fromArrayToCollection(str,co1);

Double[] dou = newDouble[200];

Collectionco2 = new ArrayList();

fromArrayToCollection(dou,co2);

Integer[] Inte = newInteger[100];

Collectionco3 = new ArrayList();

fromArrayToCollection(Inte,co3);

}

}
Output:
100

200

200

100