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