gpt4 book ai didi

Scala 类型推断和多参数列表

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

(斯卡拉 2.11.8)

考虑以下代码:

trait Class[A] {
def f1[B >: A](arg1: Int)(ord: Ordering[B]): Int

def f2[B >: A](arg1: Int, ord: Ordering[B]): Int

def f[B >: A](ord: Ordering[B]): Int = {
f1(123)(ord) // Compilation error!
f2(123, ord) // OK
}
}

这里,f1(123)(ord) 行引发了类型不匹配; found : Ordering[B] required: Ordering[A] 注意:B >: A,但 trait Ordering 在类型 T 中是不变的。您可能希望研究通配符类型,例如 _ >: A。(SLS 3.2.10)

如果我们将调用更改为 f1[B](123)(ord),错误就会消失。

为什么多个参数列表的存在会混淆类型检查器?这是错误还是预期结果?

最佳答案

这不是错误 - 参数列表的分离意味着类型参数是根据第一个参数列表单独推断的:

f1(123)(ord) 

可以重写为:

val partiallyApplied = f1(123)
partiallyApplied(ord)

现在 - partiallyApplied 的类型是什么?由于未显式设置类型参数,并且没有参数/返回类型可用于推断,因此类型参数被推断为 A(尚无具体的 B ! 所以 partiallyApplied 的类型是 (Ordering[A]) => Int),因此稍后将它与 Ordering[B] 一起使用会给出异常。

相比之下,调用时:

f2(123, ord)

由于ord的类型为Ordering[B],可以推断类型参数为B,因此编译成功。

关于Scala 类型推断和多参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42175614/

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