什么是关键字在kotlin

我无法理解,我无法在kotlin中找到out关键字的含义。

你可以在这里查看例子:

List<out T> 

如果有人能解释这个的意思。 这将是非常感激的。

有了这个签名:

 List<out T> 

你可以这样做:

 val doubleList: List<Double> = listOf(1.0, 2.0) val numberList: List<Number> = doubleList 

这意味着T协变的

当声明C类的类型参数T C <Base>可以安全地作为C <Derived>超类型

这与 ,例如

 Comparable<in T> 

你可以这样做:

 fun foo(numberComparable: Comparable<Number>) { val doubleComparable: Comparable<Double> = numberComparable // ... } 

这意味着T逆变的

当声明一个类C的类型参数T时, C <Derived>可以安全地作为C <Base>超类型

另一种方法来记住它:

消费者 ,生产者

请参阅Kotlin泛型差异

请参阅kotlin手册

Kotlin List<out T>类型是一个接口,提供只读操作,如大小,获取等。 像在Java中一样,它继承自Collection<T> ,继而从Iterable<T>继承。 改变列表的方法由MutableList<T>接口添加。 这个模式也适用于Set<out T>/MutableSet<T>Map<K, out V>/MutableMap<K, V>

和这个,

在Kotlin中,有一种方法可以向编译器解释这种事情。 这被称为声明站点差异:我们可以注释Source的类型参数T,以确保它只从Source<T>成员返回(产生),并且不会被消耗。 为此,我们提供out修饰符:

 > 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的使用地点差异形成对比,类型使用中的通配符使类型协变。

 List<out T> is like List<? super T> 

 List<in T> is like List<? implements T> 

比如在Kotlin你可以做类似的事情

  val value : List<Any> = listOf(1,2,3) //since List signature is List<out T>