【发布时间】:2019-09-23 19:13:31
【问题描述】:
考虑以下方法mean的重载定义:
def mean[T](data: Iterable[T])(implicit number: Fractional[T]): T = {
import number._
val sum = data.foldLeft(zero)(plus)
div(sum, fromInt(data.size))
}
def mean[T](data: Iterable[T])(implicit number: Integral[T]): Double = {
import number._
val sum = data.foldLeft(zero)(plus)
sum.toDouble / data.size
}
我希望返回 Double 的第二个定义仅用于 Integral 类型的情况,但是
mean(List(1,2,3,4))
导致编译错误
Error: ambiguous reference to overloaded definition,
both method mean in class A$A16 of type [T](data: Iterable[T])(implicit number: Integral[T])Double
and method mean in class A$A16 of type [T](data: Iterable[T])(implicit number: Fractional[T])T
match argument types (List[Int])
mean(List(1,2,3,4))
^
有什么方法可以利用Fractional[Int]implicit 不可用的事实来消除这两个重载的歧义?
【问题讨论】:
-
目前无法测试,但您是否尝试过添加 Dummy implicit? - 其他选择是创建自己的类型类,泛化两者。
-
我建议为此使用 typeclass - 这是在这种情况下经过验证的工作方法。
-
@LuisMiguelMejíaSuárez
Dummy似乎不起作用。
标签: scala implicit overload-resolution