下面按常见程度 + 易踩坑点给你整理 Java 泛型(Generics)常见错误,并配示例说明原因和正确写法。
T[] arr = new T[10]; // ❌ 编译错误
原因:Java 泛型有类型擦除,运行时无法确定 T 的真实类型。
✅ 正确做法:
T[] arr = (T[]) new Object[10];
或:
List<T> list = new ArrayList<>();
new 泛型类型本身T obj = new T(); // ❌
原因:运行时 T 被擦除为 Object。
✅ 解决方式(传入 Class):
T obj = clazz.getDeclaredConstructor().newInstance();
List<int> list = new ArrayList<>(); // ❌
✅ 正确:
List<Integer> list = new ArrayList<>();
class Box<T> {
static T value; // ❌
}
✅ 正确:
static Object value;
或方法级泛型:
static <T> void show(T t) {}
void test(List<String> list) {}
void test(List<Integer> list) {} // ❌ 编译错误
原因:擦除后都是 List。
instanceofif (obj instanceof List<String>) // ❌
✅ 正确:
if (obj instanceof List)
List<?> list = new ArrayList<String>();
list.add("a"); // ❌
✅ 只能读取:
Object o = list.get(0);
extends 和 super 搞反(PECS 原则)// 读
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0);
// 写
List<? super Integer> list2 = new ArrayList<Number>();
list2.add(1);
List list = new ArrayList(); // ❌ 不安全
✅ 正确:
List<String> list = new ArrayList<>();
List<String> a = new ArrayList<Object>(); // ❌
✅ 正确:
List<? extends Object> a = new ArrayList<String>();
Class<T> 与 Class<?> 混用Class<?> c = String.class;
Class<String> cs = c; // ❌
✅ 正确:
Class<String> cs = String.class;
class MyException<T> extends Exception {} // ❌
✅ 不能 new 泛型 ✅ 不能基础类型 ✅ 不能泛型数组 ✅ 静态不能用类泛型 ✅ extends 读,super 写
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。