pok*_*zok 3 java generics kotlin
我正在阅读Kotlin没有通配符的原因(https://kotlinlang.org/docs/reference/generics.htm l)。一切都到了申报地点的差异。我们有<in T>和<out T>结构应该替换通配符。我想我了解<out T>工作原理,但是遇到了麻烦<in T>。
因此,在Java中,我们可以这样写:
public List<? extends Number> list1;
public List<? super String> list2;
Run Code Online (Sandbox Code Playgroud)
初始化后的第一种情况成为只读列表(尽管不是完全不变的,因为我们可以清除它),如果我们将每个元素都视为Number,则可以读取。
第二种情况是只写的(尽管如果我们将每个元素都视为对象,则可以读取)。我们可以在那里写String及其子类。
在Kotlin中,我可以使用以下方式重新创建list1示例<out T>:
class Service {
val container = Container(mutableListOf("1", "2", "3"))
}
class Container<T>(var list1: MutableList<out T>)
Run Code Online (Sandbox Code Playgroud)
最后,我尝试了一些类似的尝试,<in T>以为我可以重新创建list2示例,但是失败了:

有人可以向我解释如何在Kotlin中实现我的list2示例吗?我应该如何<in T>以正确的方式使用构造?
Kotlin List<E>不等同于Java List<E>。Java列表具有变异功能,而Kotlin列表是只读的。Kotlin MutableList<E>相当于Java列表。
接下来,看一下List<E>声明:其类型参数为covariant(out E),并且声明站点的方差不能被使用站点的方差覆盖,这就是为什么不能使用的原因List<in T>。
而且,声明位置的差异out E意味着它E永远不会出现在in-position(没有type的函数参数,E并且没有type的可变属性E),并且实际上,由于它List<E>是只读的,因此它不考虑E其任何函数( *)。
您可以将示例转换为使用MutableList<E>:
class Container2<T>(var list2: MutableList<in T>)
Run Code Online (Sandbox Code Playgroud)
该MutableList<E>接口有其E不变的,而in在使用现场-projection不申报现场方差冲突。
(*)实际上,它确实可以,但是仅使用带有@UnsafeVariance注释的参数(该参数可以简单地抑制方差冲突),有关更多信息,请参见此处。
还有,一句话:
一切都到了申报地点的差异。我们有
<in T>和<out T>结构应该替换通配符。
实际上是使用站点差异替代了Java通配符。声明位置方差仅应用于类型参数声明(定义了类型的地方),并且在声明时,类型的所有用法都具有该差异(例如,当您使用时List<CharSequence>,实际上是List<out CharSequence>由于声明位置而引起的)的方差List<out E>)。因此,使用场所差异适用于通用类型的特定用法。
| 归档时间: |
|
| 查看次数: |
312 次 |
| 最近记录: |