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 可写;

相关推荐
qq_6543669821 分钟前
如何排查Oracle客户端连接慢_DNS解析超时与sqlnet配置优化
jvm·数据库·python
焦糖玛奇朵婷22 分钟前
解锁扭蛋机小程序的五大优势
java·大数据·服务器·前端·小程序
SamDeepThinking35 分钟前
别让一个超时的第三方http接口拖垮所有接口
java·后端·架构
YaBingSec1 小时前
玄机靶场:供应链安全-供应链应急-Part2 通关笔记
java·笔记·安全
迷途酱1 小时前
手写一个 AI Agent:从 Function Calling 到自动化任务链
python
Gerardisite1 小时前
企微机器人开发指南
java·python·机器人·自动化·企业微信
OtIo TALL1 小时前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
一 乐1 小时前
交通感知与车路协同系统|基于springboot + vue交通感知与车路协同系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·交通感知与车路协同系统
Java面试题总结1 小时前
FVG3 构建系统 MinGW 配置问题排查文档
java
乐之者v2 小时前
游标分批查询,提高查询性能
java