Kotlin 泛型函数 return 类型不符合声明的可空性

Kotlin generic function return type does not conform to declared nullability

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

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

为什么输出类型不符合声明的可空性?

T 被推导为不可为 null 的 Int

那是因为

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

T 声明为 <T: Any?> 并不意味着 T is/has 可以为空。它只意味着 T 可以 可以为空,但不一定是。

如果您传递 1Int,则 T 变为 Int

T: Any? 并不意味着“T 可以为空”。它将类型参数 T 限制为 Any? 的子类型。可空类型 以及不可空类型 满足此约束。一般来说,如果BA的子类型,那么ABA?B?都是[=的子类型20=].

当你这样做时

val n = function(1)

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

比较一下:

val n = function<Int?>(1)

你明确说 T 应该是 Int?,这是一个可为 null 的类型(也满足 : Any 的约束)。在这种情况下,函数 returns Int?!! 可以在没有警告的情况下添加。