温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java泛型实战怎么用

发布时间:2026-10-21 09:55:51 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

下面从实战角度系统讲一下 Java 泛型(Generics)怎么用,不堆概念,直接上场景和代码。


一、为什么要用泛型(先知道解决啥问题)

没有泛型:

List list = new ArrayList();
list.add("abc");
String s = (String) list.get(0); // 强制转换,容易出错

有泛型:

List<String> list = new ArrayList<>();
list.add("abc");
String s = list.get(0); // 安全、清晰

✅ 好处:

  • 编译期类型安全
  • 避免强制转换
  • 代码可读性高

二、泛型最常见的 4 种实战用法


1️⃣ 泛型类(最常用)

场景:写一个通用的“容器 / 返回结果 / 缓存”

public class Result<T> {
    private int code;
    private String msg;
    private T data;

    public Result(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // getter / setter
}

使用:

Result<String> r1 = new Result<>(200, "ok", "success");
Result<User> r2 = new Result<>(200, "ok", new User());

✅ 实战场景:

  • 接口统一返回结构
  • 缓存对象
  • DAO 层通用实体

2️⃣ 泛型方法(非常实用)

场景:工具类,不依赖类泛型

public class JsonUtils {
    public static <T> T parse(String json, Class<T> clazz) {
        // 伪代码
        return JSON.parseObject(json, clazz);
    }
}

使用:

User user = JsonUtils.parse(jsonStr, User.class);

✅ 实战场景:

  • JSON 转换
  • 对象拷贝
  • 集合工具类

3️⃣ 泛型接口(框架级常用)

public interface Repository<T> {
    T findById(Long id);
    void save(T entity);
}

实现:

public class UserRepository implements Repository<User> {
    public User findById(Long id) { ... }
    public void save(User user) { ... }
}

✅ 实战场景:

  • Spring Data
  • DAO 层
  • 策略模式

4️⃣ 通配符(难点但很重要)

? 无界通配符

public void printList(List<?> list) {
    for (Object o : list) {
        System.out.println(o);
    }
}

? extends(上界,只读)

public void sum(List<? extends Number> list) {
    double s = 0;
    for (Number n : list) {
        s += n.doubleValue();
    }
}

? super(下界,可写)

public void addNumbers(List<? super Integer> list) {
    list.add(1);
}

✅ 记忆口诀:

  • extends 读
  • super 写

三、泛型 + 实战常见坑

❌ 1. 不能 new 泛型数组

T[] arr = new T[10]; // 编译错误

✅ 正确方式:

T[] arr = (T[]) new Object[10];

❌ 2. 泛型不能用基本类型

List<int> list; // 错误

✅ 用包装类:

List<Integer> list;

❌ 3. 泛型擦除(运行期看不到)

List<String> a = new ArrayList<>();
List<Integer> b = new ArrayList<>();

a.getClass() == b.getClass(); // true

✅ 实战影响:

  • 不能用 instanceof T
  • 不能用 new T()

四、真实项目中的泛型组合技

✅ 统一返回 + 泛型

public class ApiResponse<T> {
    private int code;
    private String message;
    private T data;
}

✅ Spring 中的泛型

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private Repository<User> repository;
}

五、学习建议(很重要)

实战优先级:

  1. 泛型类(Result / DAO)
  2. 泛型方法(工具类)
  3. 通配符(看懂源码即可)

如果你愿意,我可以:

  • 用 Spring Boot 项目示例讲泛型
  • 用 **源码级(ArrayList / Stream)**讲
  • 给你 面试题版泛型梳理

你更想看哪一种?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手