Java语言的泛型

泛型,顾名思义,是指泛指一切类型的意思,那么我们什么时候会用到泛型呢?

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<>这个尖括号不要丢)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值