我不明白为什么这个代码不起作用

    class nullableGenericA<T: Any?>{
        fun someMethod(v: T){}
        fun someMethod(){
            someMethod(null)
        }
    }

错误:"Null不能是非Null类型T的值". 它是怎么运作的?如果可空的不是类型的一部分,为什么要这样做

   class NullableGenericB<T>(val list: ArrayList<T>){
       fun add(obj: T){
           list.add(obj)
       }
   }

   fun testNullableGenericB(){
       NullableGenericB<String?>(ArrayList()).add(null)
   }

推荐答案

您的泛型类型不一定可以为空.它只有一个允许为空的上限,但没有被约束为可为空.由于T可能是非空的,因此将null作为T传递是不安全的.例如,某人可以使用不可为空的类型创建您的类的实例:

val nonNullableA = NullableGenericA<String>()

如果您希望将其设计为始终可以对泛型类型使用空值,则应该在可接受的使用位置使用T?.然后,即使T不可为空,也会在功能站点使用T的可为空版本.

class NullableGenericA<T>{
    fun someMethod(v: T?) {}

    fun someMethod() {
        someMethod(null)
    }

    fun somethingThatReturnsNullableT(): T? {
        return null
    }
}

Kotlin相关问答推荐

我可以检测一个函数是否在Kotlin中被递归调用(即,重入)吗?

如何编写带有依赖项的自定义Kotlin串行化程序?

如何避免使用公共类实现内部接口

编译后的JavaFX应用程序立即以静默方式崩溃

kotlin中如何使用子类调用父静态方法?

在kotlin中匹配多个变量

有什么方法可以要求在 kotlin 中的类型参数上进行注释?

jlink:在合并模块和 kotlin.stdlib 中打包 kotlin.*

根据字符串值动态过滤数组列表 - kotlin

如何将 `throw` 放置在辅助函数中但仍然具有空安全性?

Kotlin 中二叉树的深度

对列表中数字的子集求和

jetpack compose 将参数传递给 viewModel

IntelliJ 不会根据 ktlint 的期望对 Kotlin 导入进行排序

如何将 kotlin 集合作为 varagrs 传递?

从代码块执行和返回(在 Elvis 运算符之后)

如何在使用Koin DI的活动之间共享同一个ViewModel实例?

Kotlin - computed var 属性的用处?

将 androidx.constraintlayout:constraintlayout lib 更新到 2.0.2 版本后出现崩溃 isRtl () null 引用

如何在 Kotlin 中按字母顺序对字符串进行排序