Java 泛型(Generic)完整使用指南

Java 泛型(Generic)完整使用指南

一、什么是泛型?

泛型 = 类型参数化

把数据类型 当作参数传递,让类/接口/方法可以支持任意类型 ,同时在编译期检查类型安全。

作用:

  1. 提高代码复用性(一套代码支持多种类型)
  2. 类型安全,编译期就报错,不会运行时ClassCastException
  3. 避免强制类型转换

二、泛型的三种使用场景

1. 泛型类

java 复制代码
// T 是类型参数,可以随便写:T/E/K/V 都行
public class Result<T> {
    private T data;

    public T getData() {
        return data;
    }

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

使用:

java 复制代码
Result<String> result = new Result<>();
result.setData("hello");
String data = result.getData(); // 不用强转

2. 泛型接口

java 复制代码
public interface MyService<T> {
    T handle(T t);
}

实现类指定类型:

java 复制代码
public class StringService implements MyService<String> {
    @Override
    public String handle(String s) {
        return s;
    }
}

3. 泛型方法

java 复制代码
// 修饰符 <T> 返回值类型 方法名
public static <T> T getFirst(T[] array) {
    if (array == null || array.length == 0) {
        return null;
    }
    return array[0];
}

使用:

java 复制代码
String[] arr = {"a", "b"};
String first = getFirst(arr);

三、泛型通配符(重点)

1. <?> 任意类型

java 复制代码
public void show(List<?> list) { }

2. <? extends T> 上限通配符(只能取,不能存)

  • T 及其子类
  • 只读,不能 add(除了 null)
java 复制代码
List<? extends Number> list = new ArrayList<Integer>();

3. <? super T> 下限通配符(能存能取)

  • T 及其父类
  • 可以 add
java 复制代码
List<? super Integer> list = new ArrayList<Number>();
list.add(100);

四、泛型常用字母约定

  • T:Type(类型)
  • E:Element(元素,集合用)
  • K:Key(键)
  • V:Value(值)
  • R:Result(返回值)

五、泛型的好处(对比)

不用泛型(不安全、要强转)

java 复制代码
List list = new ArrayList();
list.add("abc");
String s = (String) list.get(0);

用泛型(安全、简洁)

java 复制代码
List<String> list = new ArrayList<>();
list.add("abc");
String s = list.get(0);

六、泛型的重要规则(面试+坑点)

1. 泛型只在编译期有效,运行时会被擦除

java 复制代码
List<String> 和 List<Integer> 在JVM里是同一个class

2. 不能使用基本类型(int/long)

必须用包装类:Integer/Long/Double

3. 静态方法不能用类泛型

java 复制代码
public class A<T> {
    // 错误!
    public static T test(){} 
}

4. ? extends 不能 add 数据(除了null)

java 复制代码
List<? extends Number> list = new ArrayList<>();
list.add(1); // 编译报错

5. ? super 可以 add

java 复制代码
List<? super Number> list = new ArrayList<>();
list.add(1);
list.add(1.1);

七、企业真实使用场景

  1. 统一返回结果
java 复制代码
Result<T>
  1. 通用工具类
java 复制代码
BeanUtils.copyProperties(source, target);
  1. 集合类
java 复制代码
List<T>、Map<K,V>、Set<T>
  1. 通用接口/通用Service

八、一句话总结

泛型让类型变成参数,提高复用性与安全性;
编译期有效,运行时擦除;
extends 只读,super 可写;

相关推荐
fanruitian9 分钟前
pycharm 使用anaconda
ide·python·pycharm
Dwzun11 分钟前
基于SpringBoot3+Vue3的油莎豆种植管理系统
java·前端·vue.js·spring boot·后端·python·计算机网络
代码山河9 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行9 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
学长毕设9 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
梯度下降者9 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
zzu123zsw10 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
“AI国潮设计-小江”11 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
源码集结号11 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算