我想了解這個函式:
我想了解這個函式。
public inline fun <T, R, C : MutableCollection<in R>> Array<out T>。 flatMapTo(目的地。C, transform: (T) -> Iterable<R> ): C {
for(元素in this)。{
val list = transform(element)
destination.addAll(list)
}
return destination
}
如果我把in
與out
在MutableCollection<in R>
中交換,destination.addAll(list)
就會停止作業。錯誤在于,addAll
沒有期待什么。
為什么不作業了?很明顯,list
是一個Iterable<R>
,而不是一個R
型別的物件。
例如,
val list = listOf("abc"/span>)
list.flatMap{it.toList()}。
在我看來,Iterable<R>
是一個"abc "的串列
,而不是 "abc "本身。我的意思是 "abc "的串列不是R
,而是整個Iterable<R>
。那么為什么out
會阻止代碼作業呢?
uj5u.com熱心網友回復:
外部預測型別不能使用消耗通用型別物件的方法
。這就是外投影型別的作業原理。當你寫C : MutableCollection<out R>
時,這意味著C
是R
的生產者,或者說C
是MutableCollection
的子型別,它只能有生產R
的方法,它不能支持任何消費R
或任何其他具有型別引數R
的通用型別。
由于destination
是C
型別,你會得到Nothing
的錯誤提示,表示這個集合的消費方法是不可訪問的。
使用in
使得它成為R
的消費者,因此你可以使用addAll
,它是R
的消費者方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318625.html
標籤: