2011-11-04 1 views
4

Scala 2.8.1Pourquoi le compilateur scala ne trouve-t-il pas de valeur de paramètre/conversion implicite lorsqu'il s'agit d'une surcharge et qu'il a un type de paramètre générique?

Prenez la hiérarchie de classe suivante

abstract class A 

class B extends A 

class C extends A 

Pourquoi le compilateur scala incapable de trouver le paramètre implicite send lors de l'envoi d'une instance de B ci-dessous

implicit def routingKeyFor[T <: A](value: T) = 
    value.getClass.getSimpleName 

implicit def routingKeyFor(value: C) = "custom C" 

def send[T <: A](value: T)(implicit createRoutingKey: T => String): 
Validation[Throwable, String] = Success(createRoutingKey(value)) 

val resultOfSendingB = send(new B) 
val resultOfSendingC = send(new C) 

Pourquoi le compilateur est-il capable de localiser la valeur du paramètre implicite lorsque la version générique de routingKeyFor est renommée?

implicit def someOtherName[T <: A](value: T) = 
    value.getClass.getSimpleName 

Répondre

3

La seconde implicite est l'observation de la première. Pourquoi est-ce que n'importe qui devine, et vous pourriez ouvrir un problème pour cela (après avoir vérifié que cela n'a pas été signalé auparavant), mais ce pourrait être juste une de ces choses qui jettent une clé dans les travaux d'inférence de type.

Questions connexes