Kotlin中的Java泛型
Kotlin中泛型与Java中的泛型有点不同。当导入Java中的类型到Kotlin时需要做一些转换:
- Java通配符被转换为类型映射:Foo<? extends Bar>变成Foo<out Bar!>!;Foo<? super Bar>变成Foo<in Bar!>!
- Java中的未申明的类型会被转换成星号映射:List变成List<*>!,比如List<out Any?>!。
和Java类似,Kotlin的泛型不会在运行时保留,比如,对象不会携带关于真实类型参数的信息给它们的构造器,比如ArrayList<Integer>()不能与ArrayList<Character>()进行区分。这导致无法使用is-check来进行判断。Kotlin只允许使用is-check来检查星号映射泛型类型:
if (a is List<Int>) // Error: cannot check if it is really a List of Ints
if (a is List<*>) // OK: no guarantees about the contents of the list