Utilizando el método implícitamente
El enfoque más común y general es utilizar el implicitly method, definido en Predef:
def add[T: Numeric](x: T, y: T) = implicitly[Numeric[T]].plus(x,y)
Obviamente, esto es un tanto detallado y requiere repitiendo el nombre de la clase de tipo.
Hacer referencia el parámetro de pruebas (no lo hacen!)
Otra alternativa es utilizar el nombre del parámetro evidencia implícita generada automáticamente por el compilador:
def add[T: Numeric](x: T, y: T) = evidence$1.plus(x,y)
Es sorprendente que esta técnica es incluso legal, y no se debe confiar en ella en la práctica ya que el nombre del parámetro de evidencia podría cambiar.
Contexto de un tipo superior (introducir el método context
)
su lugar, se puede usar una versión reforzada-up del método implicitly
. Tenga en cuenta que el método implícitamente se define como
def implicitly[T](implicit e: T): T = e
Este método simplemente se basa en el compilador para insertar un objeto implícito del tipo correcto del ámbito circundante en la llamada al método, y luego lo devuelve. Podemos hacer un poco mejor:
def context[C[_], T](implicit e: C[T]) = e
Esto nos permite definir nuestro método add
como
def add[T: Numeric](x: T, y: T) = context.plus(x,y)
Los parámetros de tipo context
método Numeric
y T
se infiere a partir del alcance! Desafortunadamente, hay circunstancias en las que este método context
no funcionará. Cuando un parámetro de tipo tiene múltiples límites de contexto o hay múltiples parámetros con diferentes límites de contexto, por ejemplo.Podemos resolver este último problema con una versión ligeramente más complejo:
class Context[T] { def apply[C[_]]()(implicit e: C[T]) = e }
def context[T] = new Context[T]
Esta versión nos obliga a especificar el parámetro de tipo cada vez, pero maneja múltiples parámetros de tipo.
def add[T: Numeric](x: T, y: T) = context[T]().plus(x,y)
¡Hack inteligente con el método 'context'! –
Chico, si pensara que alguien dependía del nombre del parámetro de evidencia de esa manera lo cambiaría una vez por semana más o menos ... también, la técnica no es legal en mi jurisdicción, pero tal vez las leyes son diferentes donde usted vivir. – extempore
Muy inteligente de hecho. – pedrofurla