Kotlin泛型函数返回类型不符合声明的可为null性


fun <T: Any?> function(input: T): T = input
fun function2() {
val n = function(1)!!
}

由于T被声明为可以为null,所以我希望输出也是可以为null的,但Lint会产生Unnecessary non-null assertion (!!) on a non-null receiver of type Int警告。将输出类型签名更改为T?会使警告消失。

为什么输出类型不符合解密的可空性?

T: Any?并不意味着";CCD_ 5是可为空的";。它将类型参数T约束为Any?的一个子类型。可为null的类型以及不可为null类型满足此约束。通常,如果BA的亚型,那么ABA?B?都是A?的亚型。

当你做

val n = function(1)

类型参数T被推断为Int,其是满足约束: Any?的不可为null的类型。函数被声明为返回一个T,因此在本例中它返回一个Int。这里没有问题,不需要!!

将其与进行比较

val n = function<Int?>(1)

其中明确表示T应该是Int?,这是一个可为null的类型(也满足: Any的约束(。在这种情况下,函数返回Int?,并且可以在没有警告的情况下添加!!

T声明为<T: Any?>并不意味着T可以为null。这只意味着T可以为null,但不必是.

如果通过1,即Int,则T变为Int

T被推导为Int,它是不可为null的

这是因为

function(1) --> 1 is not nullable and no need for assertion 

最新更新