泛型类
泛型最主要的目的之一就是为了创造容器类,指定容器要持有什么类型的对象。
public Class Holder<T>{
private T a;
public Holder(T a){
this.a = a;
}
public void set(T a){
//
}
public T get(){
//
}
}
泛型接口
例如生成器(generator),
//定义一个泛型接口
public interface Generator<T> {
public T next();
}
class BaseGenerator<T> implements Generator<T>{
private Class<T> type;
public BaseGenerator(Class<T> type){
this.type = type;
}
@Override
public T next(Class<T> type) {
return type.newInstance();
}
public static <T> Generator<T> create(Class<T> type){
return new BaseGenerator<T>(type);
}
}
(1)未传入泛型参数
/**
* 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
*
* @author admin
*
* @param <T>
*/
public class Generic1<T> implements Generator<T> {
@Override
public T next() {
return null;
}
}
(2)传入泛型参数
/**
* 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型
*
* @author admin
*
*/
public class Generic2 implements Generator<String> {
@Override
public String next() {
return "";
}
}
泛型方法
要定义泛型方法,只需要将泛型参数列表置于返回值之前,如下:
public Class GenericMethords{
public <T> void f(T x){
System.out.printLn(x.getClass().getName());
}
}
注意:当使用泛型类时,必须在创建对象的时候指定类型参数的值,而使用泛型方法的时候,通常不必指明参数类型,因为编译器会为我们找出具体的类型。这称为类型参数推断。如果调用f()时传入基本类型,自动打包机制就会介入其中,将基本类型的值包装为对应的对象。