(斯卡拉 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)
raises type mismatch; found : Ordering[B] required: Ordering[A] Note: B >: A, but trait Ordering is invariant in type T. You may wish to investigate a wildcard type such as _ >: A. (SLS 3.2.10)
如果我们将调用更改为f1[B](123)(ord)
,错误消失。
为什么多个参数列表的存在会让类型检查器感到困惑?这是一个错误,还是预期的结果?
这不是一个错误 - 参数列表的分离意味着类型参数是根据first单独的参数列表:
f1(123)(ord)
可以重写为:
val partiallyApplied = f1(123)
partiallyApplied(ord)
现在——什么是partiallyApplied
的类型?由于未显式设置类型参数,并且没有可用于推理的参数/返回类型,因此类型参数被推断为A
(没有具体的B
然而!所以partiallyApplied
的类型是(Ordering[A]) => Int
),因此将其与Ordering[B]
后来给出了例外。
相反,当调用时:
f2(123, ord)
Since ord
有类型Ordering[B]
,类型参数可以推断为B
,因此编译成功。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)