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

标签