泛型,顾名思义,是指泛指一切类型的意思,那么我们什么时候会用到泛型呢?
public class Stack {
private int arr[];
private int top;
public Stack(int size){
arr = new int[size];
top = -1;
}
public void push(int value){
if(top == arr.length-1){
System.out.println("栈已满");
return;
}
arr[++top] = value;
}
public void pop(){
if(top == -1){
System.out.println("栈已空");
return;
}
System.out.println(arr[top--]);
}
}
如图所示,这是一个栈类,类里面可以存放栈的属性,并且定义了出栈和入栈的方法。目前arr数组的数据类型是int,假如我们想把字符串存进去该怎么做呢?我们可以把arr的类型改成String,但是那样的话又存不了整形,改来改去很麻烦,那么问题来了,怎么解决这种麻烦呢?于是Java引入了泛型。
一.泛型的写法
public class Stack<V> {
private V arr[];
private int top;
public Stack(int size){
arr = (V[]) new Object[size]; //强制类型转换
top = -1;
}
public void push(V value){
if(top == arr.length-1){
System.out.println("栈已满");
return;
}
arr[++top] = value;
}
public void pop(){
if(top == -1){
System.out.println("栈已空");
return;
}
System.out.println(arr[top--]);
}
}
这是使用了泛型修改之后的栈类。我们来讲一讲泛型的语法:
public class Stack<V>{};
<V> 是泛型的类型参数声明,其中 V 是类型参数的名称(通常使用单个大写字母)。
这个声明表示 Stack 类是一个泛型类,它可以接受一个具体的类(如 Integer、String 等)作为参数,在类内部用 V 代表这个类型。
private V arr[];
这里的 V 就是上面声明的类型参数,用于定义数组 arr 的元素类型。
当 Stack 被具体使用时(如 Stack<Integer>),V 会被替换为 Integer,此时 arr 就相当Integer[]。
public void push(V value) { };
方法 push 的参数 value 的类型被声明为 V,表示该方法接受的参数类型必须与泛型类声明的类型一致。
例如,当 Stack 实例化为 Stack<String> 时,push 方法只能接受 String 类型的参数。
arr = (V[]) new Object[size];
Java 泛型是不能直接使用 new V[size] 创建泛型数组的。
因此,这里先创建 Object[] 数组,再强制转换为 V[](这是泛型数组创建的常见写法)。
通过上述语法,Stack 类可以适配任意数据类型,而无需为每种类型单独编写一个 Stack 类。泛型确保了编译时的类型安全,同时提高了代码的复用性。
那么,泛型的基本语法学会了,该怎么调用呢?
二.泛型的调用
我们先来举例,假如我们想在栈里添加整形类型的数据,我们的代码应该这样写:
Stack<Integer> stack = new Stack<>(10);
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.pop();
stack.pop();
stack.pop();
相信大家也注意到了,关键是Stack后面<>里的内容该怎么写,这时要用到我们的包装类(包装类的具体内容我的另一篇博客有详细的讲解):
包装类:基本数据类型对应的类。
基本数据类型:int, double, boolean, char, long, float, byte, short
包装类:Integer, Double, Boolean, Character, Long, Float, Byte, Short
我们想使用什么类型的数据,就在<>里写进去我们想使用的基本数据类型所对应的包装类名。(不要忘了new后面的Stack<>这个尖括号不要丢)
2429

被折叠的 条评论
为什么被折叠?



