Scala дважды находит мое неявное преобразование, вызывая «неоднозначные неявные» ошибки - PullRequest
1 голос
/ 10 марта 2012

Я играю со сторонней библиотекой, которая имеет интерфейс PropertyContainer.Он позволяет вам получить / установить свойства в терминах java.lang.Object, но на самом деле он поддерживает только Java-примитивы, строки и массивы этих вещей.Поэтому я пытаюсь сделать легкую оболочку для класса контейнера свойств.

Property.scala

class Property[A <% NeoTypeEvidence[A]](val name: String) {
  def apply(pc: PropertyContainer) = pc.getProperty(name).asInstanceOf[A]
  def update(pc: PropertyContainer, value: A) = pc.setProperty(name, value)
}

package.scala

{
  sealed trait NeoTypeEvidence[A]
  object AnyValTypeEvidence extends NeoTypeEvidence[AnyVal]
  object StringTypeEvidence extends NeoTypeEvidence[String]
  object AnyValArrayTypeEvidence extends NeoTypeEvidence[Array[AnyVal]]
  object StringArrayTypeEvidence extends NeoTypeEvidence[Array[String]]

  implicit def anyValToEvidence(v: AnyVal) = AnyValTypeEvidence
  implicit def stringToEvidence(s: String) = StringTypeEvidence
  implicit def anyValArrayToEvidence(v: Array[AnyVal]) = AnyValArrayTypeEvidence
  implicit def stringArrayToEvidence(s: Array[String]) = StringArrayTypeEvidence
}

тестовый файл

val name = new Property[String]("name")

Я ожидаю, что это будет работать нормально, если предположить, что компилятор найдет неявный StringTypeEvidence для удовлетворения условия [String <% NeoTypeEvidence[String]],Вместо этого я получаю сообщение об ошибке:

ambiguous implicit values:  
both method stringToEvidence in package neo of type 
  (s: String) com.dylemma.neo.package.StringTypeEvidence.type  
 and method stringToEvidence in package neo of type 
  (s: String) com.dylemma.neo.package.StringTypeEvidence.type  
match expected type 
String => com.dylemma.neo.package.NeoTypeEvidence[String]

Итак, Scala дважды находит мое неявное преобразование ??Я несколько раз делал clean + rebuild, но это ничего не исправило.Почему это происходит и как я могу это исправить?

edit / note: Я замечаю, что это происходит только при попытке создать Property в том же пакете, где ипоследствия были определены.Так что, если я делаю точно такой же код в some.other.package и импортирую для the.main.package._, он работает без жалоб.Я до сих пор не понимаю, почему.

1 Ответ

1 голос
/ 02 ноября 2015

Я предполагаю, что вы импортируете неявное дважды. Проверьте правила для неявного разрешения здесь .

Скорее всего (хотя это трудно сказать в вашем примере), вы используете явный импорт, одновременно работая над тем же пакетом, где неявное уже присутствует по умолчанию.

...