Scala encuentra mi conversión implícita dos veces, lo que provoca errores "implícitos ambiguos"
Frecuentes
Visto 400 veces
1
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é.
1 Respuestas
1
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 scala implicit-conversion implicit or haz tu propia pregunta.
Funciona para mí, pero sin embargo podrías mover los implícitos a
NeoTypeEvidence
compañero de objeto y ver si eso ayuda. - fotNelton¿Está la cosa en
package.scala
dentro de un objeto de paquete que olvidaste mencionar? - Iulian DragosSí, el rasgo y los implícitos estaban dentro.
package object neo
- Dylan