当Java遇上泛型:类型安全的魔法之旅
创始人
2025-07-13 21:10:55
0

哈喽,大家好,我是了不起。

泛型是jdk1.5之后出现的新特性,其本质是参数化类型(type parameters),通过参数化类型让代码可以应用于多种类型。

泛型是什么

泛型,即“参数化类型”,就是将类型由原来的具体类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

常用的泛型变量

  • Element(E):元素,多用于java框架集合
  • Key(K) :关键字
  • Number(N) : 数字
  • Type(T) : 类型
  • Value(V) : 值

如果没有泛型会怎么样?

public class Demo {

    public static int add(int a ,int b){
        return a+b;
    }

    public  static  float add(float a,float b){
        return a+b;
    }
    
    public static void main(String[] args) {
        Demo.add(1, 2);
        Demo.add(1f, 2f);
    }
}

如果我们利用泛型,只需要定义一个方法

public class Demo {

    public static  int add(T a, T b) {
        System.out.println(a + "+" + b + "=" + (a.intValue() + b.intValue()));
        return a.intValue() + b.intValue();
    }

    public static void main(String[] args) {
        Demo.add(1, 2);
        Demo.add(1f, 2f);
    }
}

所以泛型的意义在于

  1. 适用于多种数据类型执行相同的代码
  2. 泛型中的类型在使用时指定,不需要强制转换类型(类型安全,编译器会检查类型)

泛型的使用

泛型类

示例:

public class DemoT {
    private T data;

    public T getData(){
        return data;
    }

    public void setData(){
        this.data = data;
    }
}

案例

@Data
public class Person {
    private  String name;
    private int age;
    private A data;
}

public class Demo {
    public static void main(String[] args) {
        //传入String类型
        DemoT t = new DemoT<>(); 
        t.setData("泛型");
    }
}

泛型接口

示例:

public interface IntercaceName {
    T getData();
}

实现接口时,可以选择指定泛型类型,也可以选择不指定,如下:

指定类型:

public class Interface1 implements IntercaceName{
    private String text;
    @Override
    public String getData() {
        return text;
    }
}

不指定类型:

public class Interface1 implements IntercaceName{
    private T text;
    @Override
    public T getData() {
        return text;
    }
}

泛型方法

示例:

private static  T 方法名 (T a,T b){}

public class Demo {
    public static void main(String[] args) {
        print("泛型");
    }
    public static  void print(A a){
        System.out.println(a);
    }
}

泛型限制类型

在使用泛型时,可以指定泛型的限定区域

泛型中的通配符 ?

//1.  指定了泛型类型的上届
//2.  指定了泛型类型的下届
//3.  指定了没有限制的泛型类型

public class Demo {
    public static void main(String[] args) {
        //上届限定
        //不能将一个装着苹果的盘子,看做一个装着水果的盘子
        Plants p = new Plants();
        //下届限定
        Plants p1 = new Plants();
    }
}
interface Fruit{}
class Apple implements Fruit{}
class Plants{
    T data;
}

作用

  1. 提高了代码复用率
  2. 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)

注意

在编译之后程序会采取去泛型化的措施,也就是说Java中的泛型,只在编译阶段有效。

在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说泛型信息不会进入到运行时阶段。

总结

相信大家日常工作中肯定是经常用到泛型,尤其是集合的使用。有时候也会自定泛型来简化代码,一句话就是能用泛型就尽量用泛型。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...