我的代码中有一个类型别名,如下所示:
type Time = Double
我经常在测试和应用程序中将Long值传递给使用此类型的函数。例如:
def at(time : Time) : T = {
// Do Something
}
at(System.currentTimeMillis)
此代码工作正常,除非在我的测试中运行,我收到以下错误:
found : Long
required: com.github.oetzi.echo.Echo.Time
Note that implicit conversions are not applicable because they are ambiguous:
both method long2double in object Predef of type (x: Long)Double
and method longToDouble in trait NumericBaseMatchers of type (s: Long)Double
are possible conversion functions from Long to com.github.oetzi.echo.Echo.Time
查找NumericBaseMatchers
之后,它似乎是Specs测试框架的一部分(我的测试是在Specs 1中编写的)。我尝试运行代码来获取解释器中的错误,并且测试结果很好。
有什么方法可以以某种方式消除歧义,所以我可以将Long传递给Double / Time函数的值?为什么Specs在Scala已提供此功能时尝试创建自己的LongToDouble转换?
答案 0 :(得分:1)
如果要停用继承的隐式转换,可以执行以下操作:
override def longToDouble(s: Long) = super.longToDouble(s)
为方便起见,如果将其添加到新特性中,您可以在需要时将特性混合到您的规格中:
trait NoConversion {
override def longToDouble(s: Long) = super.longToDouble(s)
}
class MySpecification extends NoConversion {
...
}
答案 1 :(得分:0)
尝试不加其中一个。
import NumericBaseMatchers.{longToDouble => _}