Tour of Scala

Límite de tipado superior

Language

En Scala, los parámetros de tipo y los tipos abstractos pueden ser restringidos por un límite de tipado. Tales límites de tipado limitan los valores concretos de las variables de tipo y posiblemente revelan más información acerca de los miembros de tales tipos. Un límite de tipado superior T <: A declara que la variable de tipo T es un subtipo del tipo A. Aquí se muestra un ejemplo el cual se basa en un límite de tipado superior para la implementación del método polimórfico findSimilar:

trait Similar {
  def isSimilar(x: Any): Boolean
}
case class MyInt(x: Int) extends Similar {
  def isSimilar(m: Any): Boolean =
    m.isInstanceOf[MyInt] &&
    m.asInstanceOf[MyInt].x == x
}
object UpperBoundTest extends App {
  def findSimilar[T <: Similar](e: T, xs: List[T]): Boolean =
    if (xs.isEmpty) false
    else if (e.isSimilar(xs.head)) true
    else findSimilar[T](e, xs.tail)
  val list: List[MyInt] = List(MyInt(1), MyInt(2), MyInt(3))
  println(findSimilar[MyInt](MyInt(4), list))
  println(findSimilar[MyInt](MyInt(2), list))
}

Sin la anotación del límite de tipado superior no sería posible llamar al método isSimilar en el método findSimilar. El uso de los límites de tipado inferiores se discute aquí.