1
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?使警告消失。

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

4

4 回答 4

3

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

当你这样做

val n = function(1)

类型参数T被推断为 be Int,这是一个满足约束的不可为空的类型: Any?。该函数被声明为返回 a T,因此在这种情况下它返回一个Int。这里没有问题,!!也没有必要。

将其与以下内容进行比较:

val n = function<Int?>(1)

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

于 2022-01-08T15:16:34.130 回答
2

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

如果你通过1了which is Int,那么T就变成了Int

于 2022-01-08T15:15:23.713 回答
0

T 被推导出为不可为空的 Int

于 2022-01-08T15:11:45.470 回答
0

那是因为

function(1) --> 1 is not nullable and no need for assertion 
于 2022-01-08T15:15:13.010 回答