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
可以 可以为空,但不一定是。
如果您传递 1
即 Int
,则 T
变为 Int
。
T: Any?
并不意味着“T
可以为空”。它将类型参数 T
限制为 Any?
的子类型。可空类型 以及不可空类型 满足此约束。一般来说,如果B
是A
的子类型,那么A
、B
、A?
、B?
都是[=的子类型20=].
当你这样做时
val n = function(1)
类型参数T
被推断为Int
,这是一个满足约束: Any?
的不可空类型。该函数被声明为 return 一个 T
,因此在本例中它是 return 一个 Int
。这里没有问题,不需要!!
。
比较一下:
val n = function<Int?>(1)
你明确说 T
应该是 Int?
,这是一个可为 null 的类型(也满足 : Any
的约束)。在这种情况下,函数 returns Int?
和 !!
可以在没有警告的情况下添加。
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
可以 可以为空,但不一定是。
如果您传递 1
即 Int
,则 T
变为 Int
。
T: Any?
并不意味着“T
可以为空”。它将类型参数 T
限制为 Any?
的子类型。可空类型 以及不可空类型 满足此约束。一般来说,如果B
是A
的子类型,那么A
、B
、A?
、B?
都是[=的子类型20=].
当你这样做时
val n = function(1)
类型参数T
被推断为Int
,这是一个满足约束: Any?
的不可空类型。该函数被声明为 return 一个 T
,因此在本例中它是 return 一个 Int
。这里没有问题,不需要!!
。
比较一下:
val n = function<Int?>(1)
你明确说 T
应该是 Int?
,这是一个可为 null 的类型(也满足 : Any
的约束)。在这种情况下,函数 returns Int?
和 !!
可以在没有警告的情况下添加。