Java和Kotlin泛型在实现机制、类型擦除、协变逆变等核心特性上存在显著区别,Kotlin泛型更灵活且类型安全更高。一、泛型实现机制差异1. Java泛型:基于类型擦除,编译后泛型参数会被替换为Object(无界通配符)或具体类型边界,运行时无法获取泛型实际类型(如`List<String>`运行时等价于`List`)。2. Kotlin泛型:支持实化类型参数(reified type parameters),通过`inline`函数结合`reified`关键字,可在运行时保留泛型类型信息(如`inline fun <reified T> isInstance(obj: Any) = obj is T`可直接判断类型)。二、类型擦除与通配符1. Java通配符:使用`? extends T`(上界)、`? super T`(下界)和`?`(无界)实现协变逆变,语法较繁琐。2. Kotlin通配符:通过`out`(等价于`? extends`)、`in`(等价于`? super`)和`*`(无界,等价于`?`)简化语法,且支持星号投影(*) 更直观。三、协变与逆变支持1. Java:仅支持有限协变(如`List<? extends Number>`可接收`List<Integer>`),逆变需通过`? super`实现,且泛型类本身默认不变。2. Kotlin:泛型类可直接声明`out`(协变)或`in`(逆变),如`interface List<out E>`(协变)、`interface MutableList<in E>`(逆变),支持更灵活的类型关系。四、泛型约束与扩展1. Java:泛型约束通过`extends`/`super`实现,不支持直接在泛型参数上声明多个约束,且泛型类无法直接扩展泛型接口的类型参数。2. Kotlin:支持多约束(如`<T : Number, Comparable<T>>`),且泛型类可通过`where`子句声明多个约束,同时支持泛型类继承泛型接口时保留类型参数(如`class MyList<T> : List<T>`)。五、泛型数组与类型安全1. Java:不允许直接创建泛型数组(如`new T[]`会报错),需通过反射或强制转换实现,存在类型安全隐患。2. Kotlin:支持`arrayOf<T>()`等函数创建泛型数组,且通过`inline`+`reified`可安全创建泛型数组(如`inline fun <reified T> createArray(size: Int) = Array<T>(size) { ... }`)。六、泛型函数与类型推断1. Java:泛型函数需显式声明类型参数(如`<T> T getValue()`),类型推断仅在方法调用时生效(如`getValue<String>()`)。2. Kotlin:泛型函数可通过上下文自动推断类型参数(如`val str = getValue()`),且支持泛型扩展函数(如`fun <T> List<T>.filter(predicate: (T) -> Boolean)`),语法更简洁。总结:Kotlin泛型通过实化类型、简化通配符、原生协变逆变等特性,解决了Java泛型类型擦除带来的限制,类型安全和灵活性显著提升,更适合现代编程需求。