规范隐式转换与Scala Predef冲突

时间:2012-01-29 02:06:01

标签: scala testing types implicit-conversion specs

我的代码中有一个类型别名,如下所示:

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转换?

2 个答案:

答案 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 => _}