Java泛型是编译期特性,运行时类型被擦除为原始类型,导致无法获取泛型参数、创建泛型数组、使用instanceof判断或重载泛型方法;可通过TypeToken或显式传入Class对象绕过擦除。

Java 泛型是编译期特性,运行时类型信息被擦除,只保留原始类型(如 List<String> 擦除为 List),所以无法在运行时获取泛型实际参数类型,也不能直接 new T() 或用 instanceof T。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
核心就三点
• 编译期检查:泛型确保类型安全,错误在编译阶段暴露
• 运行时不存在:字节码里没有泛型,JVM 看不到 <String> 这类信息
• 擦除后归一:所有参数化类型都变成其原始类型(ArrayList<Integer>、ArrayList<Boolean> 运行时都是 ArrayList)
典型后果要能脱口而出
• 不能通过反射获得泛型实参(list.getClass().getTypeParameters() 拿不到 String)
• 不能创建泛型数组(new T[10] 编译不过,因运行时不知 T 是啥)
• 不能用泛型做 instanceof 判断(if (obj instanceof List<String>) 语法错误)
• 同一泛型不同实参不能构成重载(f(List<String>) 和 f(List<Integer>) 编译报错)
怎么绕过擦除?关键记住两个词
• 类型令牌(TypeToken):用子类继承带泛型的父类(如 new TypeToken<List<String>>() {}),借助匿名类保留部分泛型信息
• 运行时传递 Class 对象:方法显式接收 Class<T> clazz,把类型信息“手动补上”

















