泛型的意义
泛型(参数化类型)
- 代码复用。多种类型执行相同代码
- 类型安全,编译器检查类型。泛型的类型在使用时指定,不需要强转。
通配符
- 超类型下界限定符? super T 指定类型参数的下限(该类型必须是类型T或者它的父类型)= in
- 子类型上界限定符? extends T 指定类型参数的上限(该类型必须是类型T或者它的子类型) = out
- 无界通配符 ?
在Kotlin中强调了生产消费的概念,in是消费,out是生产。
// 逆变
interface Consumer<in T> {
fun consume(item: T)
}
// 协变
interface Production<out T> {
fun produce(): T
}
逆变和协变
任何能用父类做为输入参数的地方,当然也能用子类作为替换,这叫逆变(Contravariant)。 in
任何返回子类的地方,当然也能安全的向上转行为父类。这叫协变(Covariant)。 out
父类泛型对象可以赋值给子类泛型对象,用 in;
子类泛型对象可以赋值给父类泛型对象,用 out。
类型擦除
-
Java中泛型在运行期是不可见的,会被擦除为它的上级类型。如果是没有限定的泛型参数类型,就会被替换为Object.
-
Java和Kotlin 的泛型实现,都是采用了运行时类型擦除的方式。也就是说,在运行时,这些类型参数的信息将会被擦除。
-
Java 和Kotlin 的泛型对于语法的约束是在编译期。
More info: CSDN