Scala encuentra mi conversión implícita dos veces, lo que provoca errores "implícitos ambiguos"

Estoy jugando con una biblioteca de terceros que tiene un PropertyContainer interfaz. Le permite obtener/establecer propiedades en términos de java.lang.Object, pero en realidad solo admite primitivos de Java, cadenas y matrices de esas cosas. Así que estoy tratando de hacer un envoltorio ligero sobre la clase contenedora de propiedades.

Propiedad.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)
}

paquete.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
}

archivo de prueba

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

Espero que funcione bien, suponiendo que el compilador encuentre el StringTypeEvidence implícito para satisfacer la condición de [String <% NeoTypeEvidence[String]]. Lo que obtengo en cambio es un error:

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]

Entonces, ¿Scala está encontrando mi conversión implícita dos veces? Hice una limpieza + reconstrucción varias veces, pero eso no solucionó nada. ¿Por qué sucede esto y cómo puedo solucionarlo?

Editar nota: Me doy cuenta de que esto solo parece suceder cuando trato de crear un Property en el mismo paquete donde se definieron los implícitos. Entonces, si hago exactamente el mismo código en some.other.package y tener una importación para the.main.package._, funciona sin queja. Aunque todavía no entiendo por qué.

preguntado el 10 de marzo de 12 a las 07:03

Funciona para mí, pero sin embargo podrías mover los implícitos a NeoTypeEvidencecompañero de objeto y ver si eso ayuda. -

¿Está la cosa en package.scala dentro de un objeto de paquete que olvidaste mencionar? -

Sí, el rasgo y los implícitos estaban dentro. package object neo -

1 Respuestas

Supongo que está importando el implícito dos veces. Compruebe el reglas para la resolución implícita aquí.

Lo más probable (aunque es difícil decirlo con su muestra) es que esté utilizando una importación explícita mientras trabaja en el mismo paquete, donde lo implícito ya está presente de manera predeterminada.

respondido 02 nov., 15:14

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.