kotlin列表上的filterNotNull具有泛型类型

这是工作:

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的子类型…

谢谢!

根据Kotlin文档 :

默认的上限(如果没有指定)是Any?

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

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

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