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中'by'关键字的作用是什么?
- 3. 什么是typeof关键字
- 4. 什么是RCS关键字?
- 5. 什么是'char'关键字用于?
- 6. 什么是Symfony http_digest关键字?
- 7. swift中的“as”关键字是什么
- 8. 什么是const关键字必需
- 9. Xcode中的(named)关键字是什么?
- 10. 什么是PLSQL中的RESULT关键字?
- 11. 什么是Java的“自我”关键字
- 12. 什么是关键字填充?
- 13. $ this关键字的含义是什么?
- 14. JavaScript中的`name`关键字是什么?
- 15. 什么是Swift中的“open”关键字?
- 16. Scala forSome关键字是什么?
- 17. “With”关键字的功能是什么
- 18. Java中的native关键字是什么?
- 19. 什么是Swift中的'const'关键字?
- 20. 什么是Java中的关键字?
- 21. 绑定关键字是指什么?
- 22. 什么是synchronized关键字的使用?
- 23. 关键字strictfp是什么意思?
- 24. C++中的explicit关键字是什么?
- 25. F# - 什么是“it”关键字?
- 26. extern关键字是指什么意思?
- 27. 什么是关键部分?
- 28. 在打字稿中```关键字是做什么的?
- 29. 为什么存在异步关键字
- 30. Java键码194,关键是什么?
我认为其中最重要的一点,看到'名单 '声明是'out'使得它是不可变的(与可变集合相比,它们没有)。答案中可能会提及并强调这一点。隐式投射是这一点的结果,而不是主要观点(因为不能写信给名单,可以安全地将其作为对名单的参考)。 –
minsk
对不起,但还是无法理解。 –