
"Java 的泛型是伪泛型"这句话,其实是指 Java 的泛型实现方式 与 “真正的泛型”(如 C++ 模板、C# 的泛型)相比,并不是在运行时保留类型信息,而是通过类型擦除(Type Erasure)来实现的。这就导致了一些限制和“看起来不像泛型”的行为。
Java 的泛型只在编译期有效,运行期被“擦除”成 Object 或边界类型,因此称为“伪泛型”。
Java 的泛型在编译后会被“擦除”,替换为它们的上界(通常是 Object),并插入强制类型转换代码。
List<String> list = new ArrayList<>();
list.add("hello");
String s = list.get(0);
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0); // 强制类型转换
你会发现:运行时没有 List<String> 这个类型,只有 List。
特征 | Java 泛型 | 真正的泛型(如 C#) |
|---|---|---|
运行时保留类型信息 | ❌ 被擦除 | ✅ 保留 |
可以创建泛型数组 | ❌ 不允许 | ✅ 允许 |
可以用 T 创建对象 | ❌ 不行(擦除成 Object) | ✅ 可以 |
可以用 T 做 instanceof | ❌ 不行 | ✅ 可以 |
泛型类在运行时区分类型 | ❌ 不区分 | ✅ 区分 |
List<String> a = new ArrayList<>();
List<Integer> b = new ArrayList<>();
System.out.println(a.getClass() == b.getClass()); // true
输出是 true,说明 运行时 List<String> 和 List<Integer> 是同一个类型。
T[] arr = new T[10]; // ❌ 编译错误
T 做 instanceofif (obj instanceof T) { ... } // ❌ 编译错误
T 的实例T obj = new T(); // ❌ 编译错误
Java 的泛型是“编译期的语法糖”,运行时没有类型信息,因此被称为“伪泛型”。
如果小假的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。