泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。
定义一个泛型类
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
//key这个成员变量的类型为T,T的类型由外部指定
private T key;
public Generic(T key) {
//泛型构造方法形参key的类型也为T,T的类型由外部指定 this.key = key;
}
public T getKey(){
//泛型方法getKey的返回值类型为T,T的类型由外部指定
return key; }
}
使用泛型类
//泛型的类型参数只能是类类型(包括自定义类),不能是简单类型//传入的实参类型需与泛型的类型参数类型相同,即为Integer.
Generic<Integer> genericInteger = new Generic<Integer>(123456);
//传入的实参类型需与泛型的类型参数类型相同,即为String.
Generic<String> genericString = new Generic<String>("key_vlaue");
Log.d("泛型测试","key is " + genericInteger.getKey());
Log.d("泛型测试","key is " + genericString.getKey());
结果
D/泛型测试: key is 123456
D/泛型测试: key is key_vlaue
注意:
定义了泛型类,在使用时不一定要传入实参例如这样写也是对的:
Generic generic = new Generic("111111");
Generic generic1 = new Generic(4444);
泛型的类型参数只能是类类型,不能是简单类型
不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。
if(ex_num instanceof Generic<Number>){
}
泛型接口
定义一个泛型接口
public interface Generator<T> {
public T next();
}
实现这个接口
/** * 传入泛型实参时: * 定义一个生产器实现这个接口,虽然我们只创建了一个泛型接口Generator<T> * 但是我们可以为T传入无数个实参,形成无数种类型的Generator接口。 * 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型 * 即:Generator<T>,public T next();中的的T都要替换成传入的String类型。 */
public class FruitGenerator implements Generator<String> {
private String[] fruits = new String[]{"Apple", "Banana", "Pear"};
@Override public String next() {
Random rand = new Random();
return fruits[rand.nextInt(3)];
}
}
泛型方法
public <T> T getObject(Class<T> t) throws Exception { return t.newInstance();}
泛型通配符
<?>表示能接收任意类型
<? super Class1>指定类的子类
<? extends Class2>指定类的父类