fun <T someFunction() {
val clazz = T::class.java
}
泛型的协变、逆变
在 Java 中,定义带泛型的参数时为了更好的匹配目标类型,有 ? extends Type 和 ? super Type 两种形式,以 List 接口中的定义为例:
boolean addAll(Collection<? extends E c);
void sort(Comparator<? super E c);
addAll 方法中,Collection 中的泛型被定义成接收类型参数 E 的子类,这是因为需要读取也就 c 的值,所以需要保证 c 是 Collection 的子类;而 sort 方法中,则是需要类中的类型参数 E 能够被 Comparator 中的方法传入,所以也就需要保证 E 是 Comparator 类型参数的子类。
而 Kotlin 中,针对于这两种情况给了另外两个关键字:需要读取带泛型对象的值时,使用 out 来标记类型参数;需要传入类型参数的类型作为形参时,使用 in。
这两种关键字的命名的方向是不同的:Java 偏向于从原理的方向命名,而 Kotlin 的命名对于具体的使用场景更为直观。在 Kotlin 中,被 out 标记类型参数的类型称之为协变类型,它代表当 A 是 B 的子类时,
C 也能作为 C 的子类使用;而被 in 标记类型参数的类型则相反,它代表当 A 是 B的子类时,C 是 C 的子类
。