**泛型擦除(Type Erasure)**是 Java 在引入泛型(Java 5)时为兼容旧版本而采用的设计:
编译期存在泛型信息,运行期被“擦除”为原始类型(通常是 Object 或边界类型)。
List<String> list = new ArrayList<>();
编译后等价于:
List list = new ArrayList();
❌ 不能在运行时判断:
if (list instanceof List<String>) // 编译错误
✅ 只能判断原始类型:
if (list instanceof List)
T[] array = new T[10]; // 编译错误
原因:运行时不知道 T 是什么,无法正确创建数组。
✅ 替代方案:
T[] array = (T[]) new Object[10];
List<int> list; // ❌
✅ 只能用包装类:
List<Integer> list;
void method(List<String> list) {}
void method(List<Integer> list) {} // 编译错误
擦除后签名相同,不算重载。
List<String> list = new ArrayList<>();
String s = list.get(0);
编译后等价于:
String s = (String) list.get(0);
可能引发 ClassCastException(在错误使用时)。
运行时拿不到:
class Box<T> {}
✅ 但可通过字段 / 方法返回值 / 父类泛型间接获取:
class StringBox extends Box<String> {}
Type type = StringBox.class.getGenericSuperclass();
为保证多态,编译器生成“桥方法”:
class Node<T> {
void set(T t) {}
}
擦除后生成:
void set(Object o) {}
✅ 向后兼容(Java 1.4 代码仍可运行)
✅ 运行时性能无额外开销
✅ JVM 不需要改动
泛型擦除让泛型“只在编译期有用”,运行时类型信息丢失,导致类型检查受限、反射变复杂,但也保证了 Java 的兼容性。
如果你愿意,我也可以对比 Java vs Kotlin / C# 的泛型实现差异。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。