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?使警告消失。
为什么输出类型不符合声明的可空性?
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: Any?并不意味着“T可以为空”。它将类型参数限制T为 的子类型Any?。可空类型以及不可空类型满足此约束。一般来说,如果B是 的子类型A,那么A、B、A?和B?都是 的子类型A?。
当你这样做
val n = function(1)
类型参数T被推断为 be Int,这是一个满足约束的不可为空的类型: Any?。该函数被声明为返回 a T,因此在这种情况下它返回一个Int。这里没有问题,!!也没有必要。
将其与以下内容进行比较:
val n = function<Int?>(1)
你明确地说T应该是Int?,这是一个可以为空的类型(也满足 的约束: Any)。在这种情况下,函数返回Int?,并且!!可以在没有警告的情况下添加。
声明T为<T: Any?>并不意味着它T是/必须是可空的。它只意味着T 可以为空,但不一定是。
如果你通过1了which is Int,那么T就变成了Int。
T 被推导出为不可为空的 Int
那是因为
function(1) --> 1 is not nullable and no need for assertion