3

私のコードには次のようなタイプエイリアスがあります:

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関数の値に渡すことができる方法はありますか?Scalaがすでにこれを提供しているのに、Specsが独自のLongToDouble変換を作成しようとするのはなぜですか?

4

2 に答える 2

1

継承された暗黙の変換を非アクティブ化する場合は、次のように実行できます。

  override def longToDouble(s: Long) = super.longToDouble(s)

便宜上、新しいトレイトに追加する場合は、必要に応じてトレイトを仕様にミックスインできます。

  trait NoConversion {
    override def longToDouble(s: Long) = super.longToDouble(s)
  }

  class MySpecification extends NoConversion {
     ...
  }
于 2012-01-29T20:21:49.920 に答える
0

それらの1つをインポート解除してみてください。

import NumericBaseMatchers.{longToDouble => _}
于 2012-01-29T07:46:48.193 に答える