首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文教懂你如何使用Java的泛型

一文教懂你如何使用Java的泛型

原创
作者头像
半月无霜
发布2025-02-05 20:19:44
发布2025-02-05 20:19:44
1650
举报
文章被收录于专栏:半月无霜半月无霜

一、前言

Java这门编程语言中,泛型这个知识点是我认为新手小白进阶Java语言的难点之一。

另外一个难点,我认为是多线程,这个主要难在理解,编码语法不难,所以有点人对这个知识生拉硬套。

回到Java的泛型,对它的理解,对他的编码使用,都有一点难度。不能直接的生硬的去使用,如果不好好理解Java泛型是干什么的话,后面遇到泛型,该懵逼的还是会懵逼。

那么这个时候,本篇文章,会清楚的讲解Java泛型的使用以及理解

二、泛型由来

Java1.5以前,我们可以写出这样的代码,并且编译期间不报错

代码语言:javascript
复制
package com.banmoon;
​
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
​
public class Main {
​
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        list.add("2");
        list.add(new Date());
        String s = (String) list.get(2);
    }
}

可是当我们真正在运行的时候,这段代码就会报出ClassCastException的异常

这是因为,我们没有明确定义list集合当中的元素是个什么样的类型,现在Java有了这个泛型,就可以将问题提前在编译前暴露出来

将上面的代码改成使用泛型的样子,就可以看到编辑器直接就爆红显示了

代码语言:javascript
复制
package com.banmoon;
​
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
​
public class Main {
​
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add(1);
        list.add("2");
        list.add(new Date());
        String s = (String) list.get(2);
    }
}
image-20250205193747046
image-20250205193747046

这就是泛型,用来规定其中类当中某个属性的类型,限制了这个属性只能为某个类

三、泛型的使用

1)自己的类使用泛型

在代码中,泛型的使用采用<>进行标识,我们先看下,如何自己定义一个使用泛型的类

我定义了一个Person类,里面有两个属性(姓名、资产)

至于资产是什么,我这边暂时不清楚,所以使用了泛型,

这边使用了字母T,临时当做了类名称,等到时候实例化的时候就知道了

代码语言:javascript
复制
package com.banmoon;
​
import lombok.Data;
​
@Data
public class Person<T> {
​
    /**
     * 姓名
     */
    private String name;
​
    /**
     * 资产
     */
    private T property;
​
}

使用起来就是这个样子的

代码语言:javascript
复制
package com.banmoon;
​
public class Main {
​
    public static void main(String[] args) {
        Person<Car> person = new Person<>();
        person.setName("banmoon");
        person.setProperty(new Car());
    }
}
​
class Car {
    
}

可以看到,直接实例化就行,在声明处指定一下泛型位具体的类型;后面这个实例化对象就只能使用Car作为这个人的资产

2)泛型的继承

经过上面的入门,你已经初步会了泛型的使用。

那么想想,上面的代码是否有不足之处,万一我将一坨屎作为资产呢?

这不合理吧,太恶心了,资产对象只能是有价值的东西,所以我们必须要让泛型实现一个接口

所以,经过这段分析,我们先创建一个接口Property

代码语言:javascript
复制
package com.banmoon;
​
/**
 * 资产
 */
public interface Property {
}

我们规定,人的资产必须要实现这个接口,那我们泛型Person类要如何改动呢

如下即可,只需要规定下是泛型继承自Property接口即可

代码语言:javascript
复制
package com.banmoon;
​
import lombok.Data;
​
@Data
public class Person<T extends Property> {
​
    /**
     * 姓名
     */
    private String name;
​
    /**
     * 资产
     */
    private T property;
​
}

改动好了,再回过头去看看,刚刚写的代码,编辑器爆红了

image-20250205195303295
image-20250205195303295

我们将Car实现Property即可,这样就不报错了

image-20250205195400271
image-20250205195400271

3)如何在方法中使用泛型

刚刚都是属性,现在看看如何在方法中使用泛型

其实,这也非常简单,只需要在限定修饰符后加上,自己的<>符号,在当中定义自己的泛型字母后,入参中就可以使用这个泛型字母了

同样的,在方法中可以使用这个入参做出方法的逻辑动作

代码语言:javascript
复制
    private <O> void showOther(O o) {
        System.out.println(o.toString());
    }

注意一下,如果类上面有定义好泛型,方法上想要同样的的类型,就可以不用再方法上定义了

如下,我就简单写一个两个人交换资产的方法

代码语言:javascript
复制
package com.banmoon;
​
import lombok.Data;
​
@Data
public class Person<T extends Property> {
​
    /**
     * 姓名
     */
    private String name;
​
    /**
     * 资产
     */
    private T property;
​
    /**
     * 交换资产
     */
    public void exchangeProperty(Person<T> person) {
        T selfProperty = this.getProperty();
        this.setProperty(person.getProperty());
        person.setProperty(selfProperty);
    }
​
}

如此就完成了,两个人交换资产的方法了

我们来用一下,两个人分别有一辆车,现在需要进行兑换

代码语言:javascript
复制
package com.banmoon;
​
public class Main {
​
    public static void main(String[] args) {
        Person<Car> person = new Person<>();
        person.setName("banmoon");
        person.setProperty(new Car());
​
        Person<Car> person1 = new Person<>();
        person1.setName("banmoon1");
        person1.setProperty(new Car());
​
        person.exchangeProperty(person1);
    }
}
​
class Car implements Property {
​
}

但是,如果两个人是不同的资产,就不允许进行兑换了,如下

image-20250205200558471
image-20250205200558471

这是因为person这个对象,在实例化出来的时候,它的资产就是固定的Car,而person1的资产是Money

所以person对象的交换资产的方法,就固定死了,只能是相同有Car这个资产的人才能交换

那么,这个该如何改动呢,让他们之间的资产能够相互进行转换

其实,这也非常简单,只需要简单改动下实例化的信息即可,就像这样

image-20250205201023920
image-20250205201023920

4)静态方法中使用泛型

刚刚将的是普通方法,考虑到与实例对象之间有联动,就显得复杂了点

那么静态方法,非常简单,定义和普通方法一样,直接在静态修饰符后添加上即可

代码语言:javascript
复制
package com.banmoon;
​
public class Main {
​
    public static <O extends Property> void show(O o) {
        System.out.println(o);
    }
}

四、最后

泛型的使用就是这样,它就是为了规定其中某项元素为特定的类型,或者暂时不清楚具体的类型而定下的

上面讲解的都是单泛型,在我们自己开发的时候,一个优秀的设计往往会简约的抽象泛型,一般一个泛型即可

但是为了代码的高度复用,有些类可能会采用多个泛型来设计,这个时候看源码,我建议优先看注释,这个类是做什么的,里面的每一个泛型类分别有什么作用。

好了,希望本篇文章,对您有帮助!!!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、泛型由来
  • 三、泛型的使用
    • 1)自己的类使用泛型
    • 2)泛型的继承
    • 3)如何在方法中使用泛型
    • 4)静态方法中使用泛型
  • 四、最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档