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中`external`關鍵字的用途是什麼?
- 3. Kotlin中'by'關鍵字的作用是什麼?
- 4. 什麼是typeof關鍵字
- 5. 什麼是RCS關鍵字?
- 6. 什麼是「翻譯」關鍵字在Ruby中做什麼
- 7. 什麼是synchronized關鍵字的使用?
- 8. 什麼是新的關鍵字?
- 9. 'final'關鍵字的含義是什麼?
- 10. C#中的Register關鍵字是什麼?
- 11. JavaScript中的`name`關鍵字是什麼?
- 12. 什麼是const關鍵字必需
- 13. Java中的native關鍵字是什麼?
- 14. 「With」關鍵字的功能是什麼
- 15. 什麼是PHP中的`finally`關鍵字?
- 16. 什麼是Oracle中的'THE'關鍵字?
- 17. 什麼是Symfony http_digest關鍵字?
- 18. Xcode中的(named)關鍵字是什麼?
- 19. 什麼是Swift中的'const'關鍵字?
- 20. 什麼是Java中的關鍵字?
- 21. extern關鍵字是指什麼意思?
- 22. 什麼是Rust類型關鍵字?
- 23. Scala forSome關鍵字是什麼?
- 24. 什麼是關鍵字填充?
- 25. swift中的「as」關鍵字是什麼
- 26. 什麼是C#「checked」關鍵字?
- 27. 什麼是PLSQL中的RESULT關鍵字?
- 28. 綁定關鍵字是指什麼?
- 29. $ this關鍵字的含義是什麼?
- 30. 什麼是Swift中的「open」關鍵字?
我認爲其中最重要的一點,看到'名單 '聲明是'out'使得它是不可變的(與可變集合相比,它們沒有)。答案中可能會提及並強調這一點。隱式投射是這一點的結果,而不是主要觀點(因爲不能寫信給名單,可以安全地將其作爲對名單的參考)。 –
minsk
對不起,但還是無法理解。 –