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?使警告消失。
為什么輸出型別不符合宣告的可空性?
uj5u.com熱心網友回復:
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?,并且!!可以在沒有警告的情況下添加。
uj5u.com熱心網友回復:
宣告T為<T: Any?>并不意味著它T是/必須是可空的。它只意味著T 可以為空,但不一定是。
如果你通過了1which is Int,那么T就變成了Int。
uj5u.com熱心網友回復:
T 被推匯出為不可為空的 Int
uj5u.com熱心網友回復:
那是因為
function(1) --> 1 is not nullable and no need for assertion
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/406222.html
標籤:
上一篇:如何將加載程序從0設定為100?
