Спецификации неявного преобразования конфликтуют с Scala Predef - PullRequest
3 голосов
/ 29 января 2012

В моем коде есть псевдоним типа:

type Time = Double

И я часто и в тестах, и в приложениях передаю длинные значения функциям, которые используют этот тип. Например:

 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? Почему спецификации пытаются создать свое собственное преобразование LongToDouble, когда Scala уже предоставляет это?

Ответы [ 2 ]

1 голос
/ 30 января 2012

Если вы хотите отключить унаследованное неявное преобразование, вы можете сделать это:

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

Для удобства, если вы добавите его в новую черту, вы можете при необходимости добавить свою черту в соответствие со своей спецификацией:

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

  class MySpecification extends NoConversion {
     ...
  }
0 голосов
/ 29 января 2012

Попробуйте удалить один из них.

import NumericBaseMatchers.{longToDouble => _}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...