Scala Language
Paramétrage de type (génériques)
Recherche…
Le type d'option
Un bon exemple de type paramétré est le type Option . Il s'agit essentiellement de la définition suivante (avec plusieurs autres méthodes définies sur le type):
sealed abstract class Option[+A] {
def isEmpty: Boolean
def get: A
final def fold[B](ifEmpty: => B)(f: A => B): B =
if (isEmpty) ifEmpty else f(this.get)
// lots of methods...
}
case class Some[A](value: A) extends Option[A] {
def isEmpty = false
def get = value
}
case object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
Nous pouvons également voir que cela a une méthode paramétrée, fold
, qui retourne quelque chose de type B
Méthodes paramétrées
Le type de retour d'une méthode peut dépendre du type du paramètre. Dans cet exemple, x
est le paramètre, A
est le type de x
, appelé paramètre de type .
def f[A](x: A): A = x
f(1) // 1
f("two") // "two"
f[Float](3) // 3.0F
Scala utilisera l' inférence de type pour déterminer le type de retour, ce qui contraint les méthodes pouvant être appelées sur le paramètre. Ainsi, il faut faire attention: ce qui suit est une erreur de compilation car *
n'est pas défini pour chaque type A
:
def g[A](x: A): A = 2 * x // Won't compile
Collection générique
Définir la liste des Ints
trait IntList { ... }
class Cons(val head: Int, val tail: IntList) extends IntList { ... }
class Nil extends IntList { ... }
mais que se passe-t-il si nous devons définir la liste des booléens, doubles, etc.?
Définition de la liste générique
trait List[T] {
def isEmpty: Boolean
def head: T
def tail: List[T]
}
class Cons[T](val head: [T], val tail: List[T]) extends List[T] {
def isEmpty: Boolean = false
}
class Nil[T] extends List[T] {
def isEmpty: Boolean = true
def head: Nothing = throw NoSuchElementException("Nil.head")
def tail: Nothing = throw NoSuchElementException("Nil.tail")
}