具有泛型类型的Kotlin List上的filterNotNull

时间:2016-05-09 05:29:08

标签: generics kotlin

这是有效的:

val values: List<String>  = listOf("a", null, "b").filterNotNull()

这不起作用:

fun <A> nonNullValues(values: List<A?>): List<A> = values.filterNotNull()

编译器抱怨泛型类型:

Error:(8, 63) Kotlin: Type parameter bound for T in fun <T : kotlin.Any> kotlin.collections.Iterable<T?>.filterNotNull(): kotlin.collections.List<T>
 is not satisfied: inferred type A is not a subtype of kotlin.Any

这个正在运作:

fun <A: Any> nonNullValues(values: List<A?>): List<A> = values.filterNotNull()

有人可以解释一下为什么我需要告诉编译器A是Any的子类型吗?我认为每种类型都是Any ...

的子类型

谢谢!

1 个答案:

答案 0 :(得分:6)

根据the Kotlin docs

  

默认上限(如果未指定)为Any?

这意味着有问题的声明等同于:

fun <A:Any?> nonNullValues(values: List<A?>): List<A> = values.filterNotNull()

nonNullValues方法声明返回类型为A可空项目列表,而filterNotNull则返回不可为空的项目列表A 即可。因此不匹配和编译器错误。