什么是关键字在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>