generics - 具有泛型类型的 Kotlin 列表上的 filterNotNull

标签 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 的子类型...

谢谢!

最佳答案

根据 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/

相关文章:

java - 返回与函数调用者类型相同的对象

android - Kotlin 中私有(private)和 protected 可见性修饰符有什么区别?

Java 转换 ".class"- 用于通用类型的运算符,例如列表,到 "Class<List<?>>"和 "Class<List<Integer>>"

java - Java 中的泛型 - 使用抽象类进行类型删除

java - 警告 : [unchecked] unchecked cast. 泛型

android - 可下载字体的字体粗细不适用于android

android - Activity 的 TextView 为空

kotlin - 来自2个现有数组的kotlindistant()或distinctBy {}

android - kotlin - android - 单例 View 模型中的 viewModelScope

Java:如何创建特定父类型而不是其子类型的集合?