13
A
回答
8
與此簽名:
List<out T>
,你可以這樣做:
val doubleList: List<Double> = listOf(1.0, 2.0)
val numberList: List<Number> = doubleList
這意味着牛逼是協:
當一個類型參數的一類ÇŤ被聲明出,Ç<基地>可以安全地是超的Ç<派生>。
這與在,例如,
Comparable<in T>
,你可以這樣做:
fun foo(numberComparable: Comparable<Number>) {
val doubleComparable: Comparable<Double> = numberComparable
// ...
}
這意味着牛逼是逆變:
當一個類的類型參數牛逼Ç聲明in,Ç<派生>可以安全地Ç<基地>的超類型。
另一種方式來記住它:
消費者在,生產者出。
4
參考thie manual of kotlin
的科特林
List<out T>
類型是提供只讀 操作,如大小的接口,獲取等。像在Java中一樣,它繼承自Collection<T>
並且繼而從Iterable<T>
繼承。 更改列表的方法由MutableList<T>
接口添加。這 模式也適用於Set<out T>/MutableSet<T>
和Map<K, out
V>/MutableMap<K, V>
而這一點,
在科特林,有一種方法來解釋這樣的事情到 編譯器。這稱爲聲明站點差異:我們可以註釋源的類型參數T,以確保它僅從
Source<T>
的成員返回 (產生),並且從不消耗。要做到這一點 我們提供了修改:> abstract class Source<out T> { > abstract fun nextT(): T } > > fun demo(strs: Source<String>) { > val objects: Source<Any> = strs // This is OK, since T is an out-parameter > // ... }
的一般規則是:當一個類型參數的一類
C
的T
聲明 出來,它可能只在的C
成員外位置發生,但在 返回C<Base>
可以安全地是一個超類型C<Derived>
。在「聰明詞語」他們說,類
C
是協變在 參數T
,或者T
是一個協變型參數。您可以將 C視爲T的生產者,而不是T
的消費者。 out修飾符稱爲方差註釋,由於它是在類型參數聲明站點提供的 ,所以我們討論 聲明站點方差。這與Java的使用站點 差異形成對比,其中類型用法中的通配符使類型具有協變性。
2
List<out T> is like List<? super T> in Java
和
List<in T> is like List<? implements T> in Java
例如在科特林你可以做這樣的事情
val value : List<Any> = listOf(1,2,3)
//since List signature is List<out T> in Kotlin
相關問題
- 1. header/impl關鍵字在kotlin中的含義是什麼?
- 2. Kotlin中'by'關鍵字的作用是什麼?
- 3. 什麼是typeof關鍵字
- 4. 什麼是RCS關鍵字?
- 5. 什麼是'char'關鍵字用於?
- 6. 什麼是Symfony http_digest關鍵字?
- 7. swift中的「as」關鍵字是什麼
- 8. 什麼是const關鍵字必需
- 9. Xcode中的(named)關鍵字是什麼?
- 10. 什麼是PLSQL中的RESULT關鍵字?
- 11. 什麼是Java的「自我」關鍵字
- 12. 什麼是關鍵字填充?
- 13. $ this關鍵字的含義是什麼?
- 14. JavaScript中的`name`關鍵字是什麼?
- 15. 什麼是Swift中的「open」關鍵字?
- 16. Scala forSome關鍵字是什麼?
- 17. 「With」關鍵字的功能是什麼
- 18. Java中的native關鍵字是什麼?
- 19. 什麼是Swift中的'const'關鍵字?
- 20. 什麼是Java中的關鍵字?
- 21. 綁定關鍵字是指什麼?
- 22. 什麼是synchronized關鍵字的使用?
- 23. 關鍵字strictfp是什麼意思?
- 24. C++中的explicit關鍵字是什麼?
- 25. F# - 什麼是「it」關鍵字?
- 26. extern關鍵字是指什麼意思?
- 27. 什麼是關鍵部分?
- 28. 在打字稿中```關鍵字是做什麼的?
- 29. 爲什麼存在異步關鍵字
- 30. Java鍵碼194,關鍵是什麼?
我認爲其中最重要的一點,看到'名單 '聲明是'out'使得它是不可變的(與可變集合相比,它們沒有)。答案中可能會提及並強調這一點。隱式投射是這一點的結果,而不是主要觀點(因爲不能寫信給名單,可以安全地將其作爲對名單的參考)。 –
minsk
對不起,但還是無法理解。 –