gpt4 book ai didi

scala - Scala 中关于协方差的一些问题

转载 作者:行者123 更新时间:2023-12-04 10:13:57 25 4
gpt4 key购买 nike

我正在尝试了解 Scala 中的协方差,但找不到任何可以帮助我解决此问题的示例。
我有这个代码:

    class GenericCellImm[+T] (val x: T) {}

它编译得很好,但是当我使用它时
    class GenericCellMut[+T] (var x: T) { }

它不编译。为什么我在编写这段代码时不能使用 var(但我可以使用 val)?我该如何解决?
这里也有类似的情况
    abstract class Sequence[+A] {
def append(x: Sequence[A]): Sequence[A]}

问题是什么?

最佳答案

苹果是一种水果。

一袋一成不变的苹果就是一袋一成不变的水果。一袋苹果里面装的是苹果,是水果;你可以从这样的袋子里拿出一个苹果(嗯,不是真的,因为它是不可变的,但你可以找回一个苹果的副本),然后你手里就会有一个水果。没有问题。

但是一袋可变的苹果不是可变的水果袋,因为你可以将东西放入可变的水果袋中。比如一根香蕉。一袋苹果只允许装苹果,不能装香蕉!

这正是 Scala 不允许第一个构造的原因。

第二个呢? Scala 允许您执行此操作,并进行一些修改。但结果是逆变的。实际上,您可以创建 X[Fruit]这是一种 X[Apple] . X有点像一个包,但它的作用方向相反。如果我们坚持水果类比,X 可以是什么?把它想象成一个榨汁机。您可以将苹果放入苹果榨汁机中。您可以将任何种类的水果放入果汁机中。有点矛盾的是,果汁机是一种苹果榨汁机!苹果榨汁机唯一能做的就是挤压苹果。但是果汁机也可以做到这一点,这是 is-a-kind-of(子类型)关系的基础。

关于scala - Scala 中关于协方差的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54109130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com