泛型
泛型,即参数化类型。在类型未知的时候,可以使用泛型来代替。通俗点来说,泛型就是一个参数,用来接收数据的类型。定义泛型的符号是<>。需要注意的是泛型的参数不支持多态。注意是参数。
泛型类:
class fanclass<T>{
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
public fanclass(T key) {
this.key = key;
}
@Override
public String toString() {
return "fanclass{" +
"key=" + key +
'}';
}
}
类名后面加上尖括号和参数就是泛型类,其中里面的T可以随便定义,只要不跟引用类型相同既可以。如果定义了引用类型,那么这个泛型类的泛型就确定了。在实例化泛型类的时候可以给泛型参数传入引用类型的数,需要注意的是不能传入基本数据类型,但可以传入基本数据类型的包装类。如果实例化的时候没有传入数据类型,那么就会默认为Object类型。
实例化:
fanclass f =new fanclass(100);
fanclass <String> f1 =new fanclass<>("acb");
调用方法后的返回值类型:
Object key = f.getKey();
System.out.println("key:"+key);
String key1 = f1.getKey();
System.out.println("key1"+key1);
输出结果:
key:100
key1acb
泛型方法:
以上的方法都不是泛型方法,泛型方法需要有泛型声明。
//抽奖器
class product<T>{
Random random =new Random();
//奖品
public T p;
//奖品集合
ArrayList<T> list =new ArrayList<>();
//添加奖品
public void addProduct(T t){
list.add(t);
}
//抽奖
public T getProduct(){
p =list.get(random.nextInt(list.size()));
return p;
}
public <T> T getProduct(ArrayList<T> list){
return list.get(random.nextInt(list.size()));
}
在这里我定义了一个类,注意看最后一个方法,这个方法有个<>和参数T。这个方法就是一个泛型方法。泛型方法里面的泛型参数跟泛型类的泛型参数是没有任何关系的,哪怕同名。注意,当调用泛型方法时传入参数的类型就是泛型参数的类型。
泛型方法调用:
System.out.println("----------调用泛型方法-------------");
product <Integer>p4 =new product<>();
ArrayList<String> list =new ArrayList<>();
list.add("苹果电脑");
list.add("劳斯莱斯幻影");
list.add("布加迪威龙");
list.add("柯尼塞格");
//泛型方法的类型是在调用方法的时候指定的
//泛型方法的类型跟泛型类的类型毫无关系
System.out.println(p4.getProduct(list) +"\t"+p4.getProduct(list).getClass().getSimpleName());
输出结果:
----------调用泛型方法--------