Java泛型(Generic)

135 阅读1分钟

泛型类

泛型最主要的目的之一就是为了创造容器类,指定容器要持有什么类型的对象。

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()时传入基本类型,自动打包机制就会介入其中,将基本类型的值包装为对应的对象。