2017-06-01 81 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