Kotlin 可空泛型

Mak*_*akc 3 generics nullable kotlin

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

    class nullableGenericA<T: Any?>{
        fun someMethod(v: T){}
        fun someMethod(){
            someMethod(null)
        }
    }
Run Code Online (Sandbox Code Playgroud)

错误:“Null 不能是非空类型 T 的值”。怎么运行的?如果可为空不是类型的一部分,为什么会这样

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

   fun testNullableGenericB(){
       NullableGenericB<String?>(ArrayList()).add(null)
   }
Run Code Online (Sandbox Code Playgroud)

Ten*_*r04 7

您的泛型类型不一定可以为空。它只有允许可为空的上限,但不限制为可为空。由于T可能不可为空,因此传递null为是不安全的T。例如,某人可以使用不可为 null 的类型创建类的实例:

val nonNullableA = NullableGenericA<String>()
Run Code Online (Sandbox Code Playgroud)

如果您想将其设计为始终可以对泛型类型使用可空值,那么您应该在T?可以接受的使用场所使用它。然后,即使不可为空,也会在函数站点使用T可空版本。T

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

    fun someMethod() {
        someMethod(null)
    }

    fun somethingThatReturnsNullableT(): T? {
        return null
    }
}
Run Code Online (Sandbox Code Playgroud)