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类型满足此约束。通常,如果B
是A
的亚型,那么A
、B
、A?
和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