温馨提示×

温馨提示×

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

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

java泛型常见错误

发布时间:2026-10-21 10:37:48 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

下面按常见程度 + 易踩坑点给你整理 Java 泛型(Generics)常见错误,并配示例说明原因和正确写法。


1. 不能创建泛型数组(最常见)

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

原因:Java 泛型有类型擦除,运行时无法确定 T 的真实类型。

✅ 正确做法:

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

或:

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

2. 不能 new 泛型类型本身

T obj = new T(); // ❌

原因:运行时 T 被擦除为 Object。

✅ 解决方式(传入 Class):

T obj = clazz.getDeclaredConstructor().newInstance();

3. 基础类型不能作为泛型参数

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

✅ 正确:

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

4. 静态成员不能使用类的泛型

class Box<T> {
    static T value; // ❌
}

✅ 正确:

static Object value;

或方法级泛型:

static <T> void show(T t) {}

5. 泛型擦除导致重载失败

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

原因:擦除后都是 List。


6. 误用 instanceof

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

✅ 正确:

if (obj instanceof List)

7. 泛型通配符使用错误

List<?> list = new ArrayList<String>();
list.add("a"); // ❌

✅ 只能读取:

Object o = list.get(0);

8. extends 和 super 搞反(PECS 原则)

  • Producer(生产者) → extends
  • Consumer(消费者) → super
// 读
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0);

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

9. 原始类型(Raw Type)使用

List list = new ArrayList(); // ❌ 不安全

✅ 正确:

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

10. 泛型继承关系理解错误

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

✅ 正确:

List<? extends Object> a = new ArrayList<String>();

11. Class<T> 与 Class<?> 混用

Class<?> c = String.class;
Class<String> cs = c; // ❌

✅ 正确:

Class<String> cs = String.class;

12. 异常不能使用泛型

class MyException<T> extends Exception {} // ❌

总结速记

✅ 不能 new 泛型 ✅ 不能基础类型 ✅ 不能泛型数组 ✅ 静态不能用类泛型 ✅ extends 读,super 写

如果你愿意,我也可以:

  • 用 面试题形式总结
  • 针对 Spring / Java 集合源码讲泛型
  • 帮你 debug 具体泛型报错代码
向AI问一下细节

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

AI
助
手