2017-06-01 79 views
13

我無法理解,我找不到關鍵字在kotlin中的含義。什麼是關鍵字在kotlin

你可以在這裏查詢例如:

List<out T> 

如果有任何人能解釋這是什麼意思。這將非常感激。

回答

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Ç<派生>可以安全地Ç<基地>超類型

另一種方式來記住它:

消費者,生產者

看到Kotlin Generics Variance

+0

我認爲其中最重要的一點,看到'名單 '聲明是'out'使得它是不可變的(與可變集合相比,它們沒有)。答案中可能會提及並強調這一點。隱式投射是這一點的結果,而不是主要觀點(因爲不能寫信給名單,可以安全地將其作爲對名單的參考)。 – minsk

+0

對不起,但還是無法理解。 –

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 
>  // ... } 

的一般規則是:當一個類型參數的一類CT聲明 出來,它可能只在的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