No directamente; la forma habitual en que harías esto en Scala es con una clase de letra.
trait FAble[T] { def doF: String }
object FAble {
implicit val fInt = new FAble[Int] { def doF = "I'm an int" }
implicit val fFloat = new FAble[Float] { def doF = "I'm a float" }
implicit val fBurger = new FAble[Burger] { def doF = "You want fries?" }
}
def f[T](implicit ev: FAble[T]) = ev.doF
// or
def f[T: FAble] = implicitly[FAble[T]].doF
Es un poco justo más prolija, pero tiene algunas ventajas también - los casos implícitos pueden ser calculados (utilizando implicit def
s en lugar de val
s), y no puede haber más de una instancia de cualquier tipo dado , que le permite seleccionar el comportamiento en tener distintas instancias en el alcance en diferentes puntos del código.
La razón por la que no puede hacerlo de la forma de C++ es que los genéricos Scala no implican la generación de código para los diferentes parámetros de tipo-(@specialized
un lado, ya que no hace lo que quiere tampoco). Por lo tanto, no tiene sentido decir "hey compiler", cuando vea un "Int" en esa posición, en lugar de generar el código que usaría de la plantilla genérica, use este código específico en su lugar ".