- 泛型类,是在实例化类的时候指明泛型的具体类型
- 泛型方法,是在调用方法的时候指明泛型的具体类型
- 泛型方法能使方法独立于类而产生变化
- 如果static方法要使用泛型能力,就必须使其成为泛型方法
import java.util.ArrayList;
import java.util.Random;
/**
* 抽奖器
* @param <T>
*/
public class ProductGetter<T> {
// 奖品
private T product;
// 奖品池
ArrayList<T> list = new ArrayList<>();
Random random = new Random();
// 添加奖品
public void addProduct(T t ) {
list.add(t);
}
// 抽奖
public T getProduct() {
product = list.get(random.nextInt(list.size()));
return product;
}
/**
* 定义泛型方法
* @param list 参数
* @param <T> 泛型标识,具体类型由调用方法的时候来指定
* @return
*/
public <T> T getProduct(ArrayList<T> list) {
return list.get(random.nextInt(list.size()));
}
/**
* 静态的泛型方法,采用多个泛型类型
* @param t
* @param e
* @param k
* @param <T>
* @param <E>
* @param <K>
*/
public static <T, E, K> void printType(T t, E e, K k) {
System.out.println(t + "\t" + t.getClass().getSimpleName());
System.out.println(k + "\t" + k.getClass().getSimpleName());
System.out.println(e + "\t" + e.getClass().getSimpleName());
}
/**
* 泛型可变参数的定义
* @param e
* @param <E>
*/
public static <E> void print(E ... e) {
for (int i = 0; i < e.length; i++) {
System.out.println(e[i]);
}
}
}
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
ProductGetter<Integer> productGetter = new ProductGetter<>();
ArrayList<String> strList = new ArrayList<>();
strList.add("笔记本电脑");
strList.add("苹果手机");
strList.add("扫地机器人");
// 泛型方法的调用,类型是通过调用方法的时候指定
String product1 = productGetter.getProduct(strList);
System.out.println(product1 + "\t" + product1.getClass().getSimpleName());
ArrayList<Integer> intList = new ArrayList<>();
intList.add(100);
intList.add(200);
intList.add(300);
Integer product2 = productGetter.getProduct(intList);
System.out.println(product2 + "\t" + product2.getClass().getSimpleName());
// 调用多个泛型类型的静态泛型方法
productGetter.printType(1000,"java", true);
// 可变参数的泛型方法的调用
productGetter.print(1, 2, 3);
productGetter.print("a","b","c");
}
}