泛型
1、概念
参数化类型
泛型类:
public class Test<T> {
private T test1;
public static void main(String[] args) {
Test<String> test = new Test<>();
}
}
package com.albert.sjms.fanxing;
import java.util.ArrayList;
import java.util.Random;
public class ProductGetter<T> {
//奖品
private T product;
//奖品池
ArrayList<T> list = new ArrayList<>();
public void add(T product){
list.add(product);
}
//抽奖器
public T get(){
product = list.get(new Random().nextInt(list.size()));
return product;
}
}
package com.albert.sjms.fanxing;
public class Test {
public static void main(String[] args) {
ProductGetter<String> productGetter = new ProductGetter<>();
String[] strPros = {"苹果手机","华为手机","扫地机器人","咖啡机"};
for (String strPro : strPros) {
productGetter.add(strPro);
}
String s = productGetter.get();
System.out.println("恭喜您,抽中了:"+s);
}
}
从泛型类派生子类:
-
子类也是泛型类,子类和父类泛型类型一致
class ChildGeneric<T> extends Generic<T>
-
子类不是泛型类,父类要明确泛型的类型
class ChildGeneric extends Generic<String>
泛型接口
- 实现类不是泛型类,接口要明确数据类型
- 实现类也是泛型类,实现类和接口的泛型类型要一致(实现类包含接口的泛型类型)
泛型方法
//泛型方法
public <E> E getPro(ArrayList<E> list){
return list.get(new Random().nextInt(list.size()));
}
泛型方法参数类型必须遵从泛型方法的标识,标识可以是多个,这里如果ArrayList就会报错了
类型通配符
一般是使用 “?”,类型实参,而不是类型形参
上限 <? extends Number> 只能是Number或Number子类
下限 <? super Number> 只能是Number或Number的父类