目录
3.泛型类型在逻辑上可以看成是多个不同的类型,但实际上是相同类型
一、什么是泛型
泛型----能够代表一切类型
二、为什么要有泛型
从实现栈去解释为什么要有泛型
1.实现存储数据类型是int的栈
Stack类
public class Stack {
//定义数组
private int[] arr;
private int i=-1;//游标
public Stack(int size){
arr=new int[size];
}
//添加数据(入栈)
public void add(int value){
i++;
arr[i]=value;
}
//出栈(输出)
public int 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(4);
System.out.println(stack.get());
System.out.println(stack.get());
System.out.println(stack.get());
System.out.println(stack.get());
}
}
运行结果:
这个时候我们存储整数类型的数据是没问题的,但是如果要存储字符型或者浮点型或者其他类型的数据是不行的
如果要存储String类型的数据,怎么办?
把它的类型换成String类型的就行了:
2.实现存储数据类型是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());
}
}
运行结果:
如果我们还想存储别的类型的数据呢?
那就需要再重新创建一个类,但是这样做很麻烦
这时候就可以使用泛型
3.泛型
定义方法:class 类名 <T>{...}
(<>里写什么都行)
T:创建对象的时候里面具体指定的数据类型
使用:类名 对象名=new 类名();
例:实现存储类型为泛型的栈
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());
}
}
运行结果:
在这里我们想存储什么类型的数据都可以(但是最好是同一类型)
统一类型:
如果我们想统一类型的话,可以这样写:
Stack<Integer> stack=new Stack(6);
那这时候String类型的就会报错:
4.一个抽奖的小案例
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+"元");
}
}
运行: