Dans scala, nous pouvons utiliser impleclasses pour ajouter de manière conditionnelle des méthodes sur un type paramétré en fonction des paramètres de ce type. Par exemple, Iterator.sum
:Ajout d'un contrôle de validité dépendant d'une classe de type (Implicits facultatifs)
def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)
Il doit y avoir une instance des Numeric
pour cette méthode classe de types de même être appelé:
scala> List(1, 2, 3).sum
res0: Int = 6
scala> List("a", "b").sum
<console>:6: error: could not find implicit value for parameter num: Numeric[java.lang.String]
List("a", "b").sum
^
Jusqu'à présent, si bon. Disons que je veux avoir un certain type de collection, My2Col
:
class My2Col[A](a1 : A, a2 : A)
Mais je veux exiger que, si cela est fait avec un A : Numeric
, puisa2 > a1
. Cependant, il est entièrement valide pour qu'il soit fait avec un A
qui n'est pas numérique.
My2Col("a", "b") //OK
My2Col("b", "a") //OK
My2Col(1, 2) //OK
My2Col(2, 1) //THROW IllegalArgumentException
Quelqu'un at-il des idées quant à la façon dont je pourrais le faire?
PS. Si quelqu'un a des suggestions pour un meilleur titre de la question, je suis toutes les oreilles
+1. Utilisation intelligente des valeurs d'arguments par défaut! – pedrofurla
Nice, j'aime cette solution. – axel22
@retronym est venu avec la même suggestion sur la liste de diffusion scala –