温馨提示×

温馨提示×

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

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

java泛型如何避免陷阱

发布时间:2026-09-10 04:49:15 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

Java 泛型在设计上为了保证向后兼容运行时性能,引入了很多“看似反直觉”的限制。下面从常见陷阱 → 原因 → 正确写法三个层面,系统讲讲如何避免泛型坑。


一、最常见的泛型陷阱

1️⃣ 不能 new T() / 创建泛型数组

public class Box<T> {
    T[] arr = new T[10]; // ❌ 编译错误
}

原因

  • 泛型在运行时被擦除(Type Erasure)
  • JVM 不知道 T 到底是什么

✅ 正确做法

@SuppressWarnings("unchecked")
T[] arr = (T[]) new Object[10];

List<T> list = new ArrayList<>();

2️⃣ 泛型不能用于基本类型

List<int> list = new ArrayList<>(); // ❌

✅ 正确做法

List<Integer> list = new ArrayList<>();

⚠️ 注意:自动装箱有性能成本(高频场景要小心)


3️⃣ 泛型方法 VS 泛型类混淆

class Utils {
    static <T> T get(List<T> list) { ... }
}

调用时:

Utils.get(list); // ✅

❌ 错误理解:

Utils<String>.get(list); // ❌ 泛型类语法不对

✅ 泛型方法要写 <T>


二、类型擦除带来的“隐形坑”

4️⃣ 泛型不能用于 instanceof

if (obj instanceof List<String>) // ❌

✅ 正确

if (obj instanceof List) { ... }

甚至可以用:

if (obj instanceof List<?>)

5️⃣ 重载不能仅靠泛型区分

void test(List<String> list) {}
void test(List<Integer> list) {} // ❌ 编译错误

原因 擦除后都是 List

✅ 解决

  • 改名
  • 或使用不同参数类型

三、通配符(?)使用陷阱

6️⃣ ? extends T 不能写

List<? extends Number> list = new ArrayList<>();
list.add(1); // ❌

✅ 只能读

Number n = list.get(0);

7️⃣ ? super T 不能读具体类型

List<? super Integer> list = new ArrayList<>();
list.add(1); // ✅
Integer i = list.get(0); // ❌

✅ 只能当 Object

Object o = list.get(0);

✅ PECS 原则(非常重要)

Producer → Extends,Consumer → Super

void copy(List<? extends Number> src,
          List<? super Number> dest)

四、泛型继承陷阱

8️⃣ 泛型不协变

List<String> a = new ArrayList<>();
List<Object> b = a; // ❌

✅ 用通配符

List<? extends Object> b = a;

五、类型安全问题(运行时才爆)

9️⃣ 未检查警告(unchecked)

List list = new ArrayList();
list.add("a");
List<Integer> ints = list; // 警告
int x = ints.get(0); // 运行时 ClassCastException

✅ 避免原始类型


六、最佳实践总结(避坑清单)

✅ 永远指定泛型类型
✅ 不用原始类型 List
✅ 不试图 new T() / T.class
✅ 方法返回泛型优先用 <T>
✅ 集合 API 参数用 ? extends/super
✅ 警惕擦除导致的运行时错误


如果你愿意,我也可以:

  • 真实业务代码 演示泛型陷阱
  • Java 泛型面试高频题
  • 对比 Kotlin / C# 泛型差异

你更想看哪一个?

向AI问一下细节

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

AI