温馨提示×

温馨提示×

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

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

java泛型怎么用

发布时间:2026-07-15 10:10:05 来源:亿速云 阅读:85 作者:小樊 栏目:编程语言

Java 泛型(Generics) 的核心作用是在编译期做类型检查、避免强制类型转换,同时让代码更通用、更安全。下面从 是什么、怎么用、常见场景、注意事项 讲清楚。


一、什么是泛型

泛型:参数化类型
把“类型”当参数传,而不是固定写死。

不用泛型(有风险)

List list = new ArrayList();
list.add("hello");
Integer i = (Integer) list.get(0); // 运行期可能 ClassCastException

用泛型(安全)

List<String> list = new ArrayList<>();
list.add("hello");
String s = list.get(0); // 不用强转

二、泛型的基本用法

1️⃣ 泛型类

class Box<T> {
    private T value;

    public void set(T value) {
        this.value = value;
    }

    public T get() {
        return value;
    }
}

使用:

Box<String> box = new Box<>();
box.set("hello");
String s = box.get();

2️⃣ 泛型方法

public <T> T getFirst(List<T> list) {
    return list.get(0);
}

也可以写成:

public static <T> T getFirst(List<T> list) {
    return list.get(0);
}

调用:

String s = getFirst(Arrays.asList("a", "b"));

3️⃣ 泛型接口

interface Converter<T, R> {
    R convert(T t);
}

实现:

class StringToInt implements Converter<String, Integer> {
    public Integer convert(String s) {
        return Integer.parseInt(s);
    }
}

三、泛型通配符(重点)

1️⃣ ? 无界通配符

List<?> list;

表示:某个未知类型,但不能往里写(除了 null)

List<?> list = new ArrayList<String>();
// list.add("a"); // 编译错误

2️⃣ ? extends T(上界通配符)

只读,不写

List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0);

✅ 适合:生产者(Producer)


3️⃣ ? super T(下界通配符)

可写,但读出来是 Object

List<? super Integer> list = new ArrayList<Number>();
list.add(1);

✅ 适合:消费者(Consumer)


PECS 原则(记住这个)

Producer → Extends,Consumer → Super

// 生产者
void read(List<? extends Number> list) {}

// 消费者
void write(List<? super Integer> list) {}

四、泛型在集合中的典型用法

Map<String, List<Integer>> map = new HashMap<>();
Set<Integer> set = new HashSet<>();

五、泛型的限制(很重要)

❌ 不能 new T()

T t = new T(); // 编译错误

✅ 解决方案:

public <T> T create(Class<T> clazz) throws Exception {
    return clazz.newInstance();
}

❌ 不能创建泛型数组

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

✅ 用 Object[]List<T>


❌ 泛型不能用于静态变量

class A<T> {
    static T t; // 错误
}

✅ 泛型是编译期擦除(Type Erasure)

List<String> 和 List<Integer>

在运行期都是 List


六、什么时候用泛型

✅ 当你想让代码 适用于多种类型
✅ 集合、工具类、接口设计
✅ 减少强制类型转换
✅ 提高代码可读性和安全性


七、一句话总结

泛型 = 编译期类型安全 + 代码复用

如果你愿意,我可以:

  • 通俗比喻再讲一遍
  • 结合 真实项目例子
  • 帮你 改一段你写的泛型代码
向AI问一下细节

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

AI