gpt4 book ai didi

scala - +- 在 Scala 中的通用声明中签名

转载 作者:行者123 更新时间:2023-12-02 09:37:54 24 4
gpt4 key购买 nike

我正在查看 this link 中 PartialFunction 的文档:

trait PartialFunction[-A, +B] extends (A) ⇒ B

也许有人可以帮助澄清通用声明中加号和减号的重要性?

最佳答案

“+”和“-”表示 covariant and contravariant分别类型。简而言之,这意味着:
PartialFunction[-A1, +B1] <: PartialFunction[-A2, +B2]仅当 A1 :> A2B1 <: B2 ,其中 <:是一个子类型关系。

"-"通常用于输入参数,"+"用于输出 - 在 C# 中它们甚至使用各自的关键字 inout .还有一些更原始的generic variance support in Java建立在存在类型上 - 实际上你可以使用 _ <: SomeType (协方差)或抽象类型成员 type T <: SomeType在 Scala 中也是如此。

无修饰符 PartialFunction[A1, B1]PartialFunction[A2, B2] 没有直接关系(换句话说,它将是不变的)。

附注此类类型也有一些限制,例如 covariant("+") 类型不能处于逆变位置(您只能从方法中返回它),反之亦然。这样做是为了支持 Liskov Substitution Principle并且通过“输入”/“输出”解释自然可以理解。

另外,值得注意的是A => B ( Function1 的语法糖)本身正在使用协方差/反方差:

 trait Function1 [-T1, +R] extends AnyRef

由于这些函数可以通过子类型进行扩展,这使得它们在理论上也是部分的(尽管 Scala 不是这样处理这些的) - 即使在技术上,Scala 中的“全部” FunctionN 也可以扩展、重新定义、返回 null 等等。

关于scala - +- 在 Scala 中的通用声明中签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27627782/

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