Scala Language
Tipo de parametrización (genéricos)
Buscar..
El tipo de opción
Un buen ejemplo de un tipo parametrizado es el tipo de opción . Esencialmente es solo la siguiente definición (con varios métodos más definidos en el tipo):
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")
}
También podemos ver que esto tiene un método parametrizado, fold
, que devuelve algo de tipo B
Métodos parametrizados
El tipo de retorno de un método puede depender del tipo de parámetro. En este ejemplo, x
es el parámetro, A
es el tipo de x
, que se conoce como el parámetro de tipo .
def f[A](x: A): A = x
f(1) // 1
f("two") // "two"
f[Float](3) // 3.0F
Scala utilizará la inferencia de tipos para determinar el tipo de retorno, lo que restringe los métodos a los que se puede llamar en el parámetro. Por lo tanto, se debe tener cuidado: lo siguiente es un error de tiempo de compilación porque *
no está definido para cada tipo A
:
def g[A](x: A): A = 2 * x // Won't compile
Colección genérica
Definiendo la lista de Ints.
trait IntList { ... }
class Cons(val head: Int, val tail: IntList) extends IntList { ... }
class Nil extends IntList { ... }
¿Pero qué pasa si necesitamos definir la lista de Boolean, Double, etc?
Definiendo lista genérica
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")
}