Scala tiene una serie de características que puede usar como clases de tipo, por ejemplo Ordered
y Numeric
en el paquete scala.math
.¿Por qué el comportamiento de Numeric es diferente a lo ordenado?
puedo, por ejemplo, escribir un método genérico utilizando Ordered
así:
def f[T <% Ordered[T]](a: T, b: T) = if (a < b) a else b
que quería hacer una cosa similar con Numeric
, pero esto no funciona:
def g[T <% Numeric[T]](a: T, b: T) = a * b
¿Por qué hay una discrepancia aparente entre Ordered
y Numeric
?
Sé que hay otras maneras de hacer esto, el siguiente trabajo (utiliza un marco obligado):
def g[T : Numeric](a: T, b: T) = implicitly[Numeric[T]].times(a, b)
Pero eso parece más complicado de lo que acaba de ser capaz de usar *
para multiplicar dos números. ¿Por qué el rasgo Numeric
no incluye métodos como *
, mientras que Ordered
incluye métodos como <
?
Sé que hay también Ordering
que se puede utilizar en la misma forma que Numeric
, consulta this answer:
def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)
Bonito ... ¡muy elegante! –