一.什么是泛型?
泛型能够代表一切类型
二.泛型的意义
假如现在有一个数组,我们需要往里面存入了很多元素,有String类型,有自定义类型等等;假以时日,我们在需要的时候还会再将它们从容器中取出来,如果把它们都存放在一个数组中,我们存取的时候,会显得比较混乱。此外还有一个最关键的点,如果我们不使用泛型,那么我们存入到数组中的对象会被统一当作 Object 类进行处理,在取出的时候,就不能使用我们存入时的类型特有的方法,要进行强转,这样会非常麻烦。
那么我们能不能对数组进行分类呢?有些数组只存String类型的数据,有些数组只存自定义类型的数据,这样我们不管是存还是取的时候,都会比较清晰。
既然有了目标,我们再来说方法,怎么样才能对数组进行分类的?
这就要说到我们今天要讲的泛型。
例:
实现存储数据类型是String的栈
StringStack类:
public class StringStack {
//定义数组
private String[] arr;
private int i=-1;//游标
public StringStack(int size){
arr=new String[size];
}
//添加数据(入栈)
public void add(String value){
i++;
arr[i]=value;
}
//出栈(输出)
public String get(){
return arr[i--];
}
}
Test类:
public class Test {
public static void main(String[] args) {
StringStack stringStack=new StringStack(4);
stringStack.add("张三");
stringStack.add("李四");
stringStack.add("王五");
System.out.println(stringStack.get());
System.out.println(stringStack.get());
System.out.println(stringStack.get());
}
}
输出:
三.泛型定义方法
泛型的格式为 <数据类型>
定义方法:class ClassName {…} (<>里写什么都行)
T:创建对象的时候里面具体指定的数据类型
使用:类名 对象名=new 类名();
在上述语法中,ClassName是泛型类的名称,T是类型参数的占位符,可以是任何合法的标识符,表示在使用泛型时所代表的具体类型。在泛型类中,可以使用类型参数 T 来声明成员变量、方法参数、方法返回类型等,从而使这些成员具有通用性,可以适用于不同类型的数据。
例:
实现存储类型为泛型的栈
Stack类:
public class Stack<hh> {
//定义数组
private hh[] arr;
private int i=-1;//游标
public Stack(int size){
arr=(hh[]) new Object[size];//强转
}
//添加数据(入栈)
public void add(hh value){
i++;
arr[i]=value;
}
//出栈(输出)
public hh get(){
return arr[i--];
}
}
Test类:
public class Test {
public static void main(String[] args) {
Stack stack=new Stack(6);
stack.add(1);
stack.add(2);
stack.add(3);
stack.add("张三");
System.out.println(stack.get());
System.out.println(stack.get());
System.out.println(stack.get());
System.out.println(stack.get());
}
}
输出:
发现不是同一类型的数据都被存储并打印输出了
四.抽象案例
public class ProductGetter <T>{
//奖金或奖品
private T product;
//奖品、奖金池
ArrayList<T> arrayList=new ArrayList<>();
//添加奖品到奖品池
public void add(T t){
arrayList.add(t);
}
//定义一个随机数,用来抽选奖品
Random random=new Random();
//抽奖
public T get(){
product=arrayList.get(random.nextInt(arrayList.size()));
return product;
}
}
public class Test {
public static void main(String[] args) {
ProductGetter productGetter=new ProductGetter();
String[] strPro={"手机","平板","电脑","键盘"};
//将奖品放入奖金池
for(int i=0;i<strPro.length;i++){
productGetter.add(strPro[i]);
}
String product= (String) productGetter.get();
System.out.println("恭喜您抽中了"+product);
System.out.println("-------------------------------------------");
ProductGetter<Integer> productGetter1=new ProductGetter<>();
Integer[] intPro={100,1000,10000,20000};
for(int i=0;i<intPro.length;i++){
productGetter1.add(intPro[i]);
}
Integer product1=productGetter1.get();
System.out.println("恭喜您,抽中了"+product1+"元");
}
}
输出:
五.泛型特点
1.泛型类如果没有指定具体的数据类型,就是Object
2.泛型的类型参数只能是类 类型,不能是基本数据类型
3.泛型类型在逻辑上可以看成是多个不同的类型,但实际上是相同类型