0

在 Kotlin 中,我正在学习协变(可以使用子类型代替超类型)。他们在那里写了一些类似规则的东西。但这对我来说似乎是错误的。这个已经写完了:

但是,如果类具有该泛型类型的函数参数或 var 属性,则不能使用 out。

但我认为or应该替换为and,因为在类具有“获取”类型作为参数的函数的情况下,如果泛型类型的属性是val而不是var,并且损坏无法完成,因为 val 属性无法进行任何分配。我是对的还是书中写的内容是正确的,我遗漏了什么?

编辑:我刚刚意识到(根据我在这个论坛上看到的一些帖子),尽管属性被声明为 val,但参数可能成为问题的唯一情况是,如果我们有一个 T 类型的容器,那么就说 List如果我们尝试添加到List可能会出现问题,但是如果我们没有容器,我在获取参数类型时看不到情况,而属性为 val 时可能会出现问题。我对吗?

4

1 回答 1

0

out关键字是协变,而不是逆变

下面是一个假想类中导致的问题的基本示例,其中var属性类型允许协方差:

class Container<out T>(var item: T)

val intContainer = Container<Int>(1)
val numberContainer: Container<Number> = intContainer // cast is allowed for covariant type
numberContainer.item = 5f // allowed if item is a var
val intValue = intContainer.item // Float value is cast to an Int!

这对于 a 是不可能的,因此如果是 a val,则上述类在声明站点可能是协变的。itemval

于 2020-11-14T21:37:31.487 回答