这是工作:
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 的子类型...
谢谢!
最佳答案
根据 the Kotlin docs :
The default upper bound (if none specified) is
Any?
这意味着有问题的声明相当于:
fun <A:Any?> nonNullValues(values: List<A?>): List<A> = values.filterNotNull()
nonNullValues
方法声明返回 的列表A
类型的可空项目而 filterNotNull
返回 的列表A
类型的不可为空的项目 .因此不匹配和编译器错误。
关于generics - 具有泛型类型的 Kotlin 列表上的 filterNotNull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37108275/