Why does scala compiler fail to find implicit parameter value/conversion when it is an overload and has generic type param?

StackOverflow https://stackoverflow.com/questions/8015431

Question

Scala 2.8.1

Take the following class hierarchy

abstract class A

class B extends A

class C extends A

Why is the scala compiler unable to find the implicit parameter for send when sending an instance of B below

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)

Why is the compiler able to locate the value for the implicit parameter when the generic version of routingKeyFor is renamed?

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

Solution

The second implicit is shadowing the first one. Why is anyone's guess, and you might open an issue for it (after verifying that this wasn't reported before), but it might just be one of those things that throw a spanner into the works of type inference.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top