2011-02-02 10 views
45

He visto "<:" y ">:" y "<%" etc., ¿alguien puede dar (o localizar) una buena descripción de estos? ¿Cuáles son las posibles limitaciones? ¿Qué hacen? ¿Cuál es un ejemplo de cuándo usarlas?Identificar y describir las restricciones de tipo genérico de Scala

+1

Me gusta esta interpretación http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala/2983376#2983376 – huynhjl

+0

posible duplicado de [¿Qué es el contexto de Scala y ver los límites?] (http://stackoverflow.com/questions/4465948/what-are-scala-context-and-view-bounds) – Suma

+1

Ver [O'Reilly's _Programming Scala_] (http://ofps.oreilly.com/titles/9780596155957 /index.html). Comience en [Type Bounds] (http://ofps.oreilly.com/titles/9780596155957/ScalasTypeSystem.html#TypeBounds).Creo que hace un buen trabajo explicando los límites de tipo y vista. –

Respuesta

67

S <: T significa que S es un subtipo de T. Esto también se llama upper type bound. Del mismo modo, S >: T significa que S es un supertipo de T, un lower type bound.

S <% T es una vista atado, y expresa que S debe venir equipado con un view que mapea sus valores en valores de tipo T.

También es confuso para mí, y tengo una maestría en lenguajes de programación de Berkeley.

+0

Gracias! Concisa y al grano. –

+0

Es posible que desee agregar 'S <: T' =>' S <% T' – Raphael

+1

Además, hay límites de contexto: 'S: T'. Consulte https://gist.github.com/257758/47f06f2f3ca47702b3a86c76a5479d096cb8c7ec – michid

52

Hay dos animales distintos, aunque están todos conocen como "límites" y no "limitaciones" ...

primeros son los límites del tipo:

  • <: - Tipo uppper encuadernados
  • >: - tipo límite inferior

Estos son esencialmente los mismos que super y extends en Java, y realmente será codificado como tal en el código de bytes generado, lo cual es bueno para la interoperabilidad :)

Luego viene el azúcar sintáctico:

  • <% - vista con destino
  • : - cota contexto

Estos no están codificados de manera que Java podría entender (a pesar de que están representados en la firma Scala, una anotación que sc Ala añade a todas las clases para ayudar a que el compilador y que en última instancia sería la base de una biblioteca de reflexión Scala)

Ambos se convierten en parámetros implícitos:

def fn[A <% B](arg: A) = ... //sugared 
def fn[A](arg: A)(implicit ev: A => B) = ... //unsugared 

def fn[A : Numeric](arg: A) = ... //sugared 
def fn[A](arg: A)(implicit ev: Numeric[A]) = ... //unsugared 

Por esta razón, se puede' t combine sus propios implicits con límites de vista o límites de contexto, ya que Scala solo permite que un bloque etiquetado como implícito para cualquier función o constructor.

Si necesita utilizar sus propios implicits, primero debe convertir manualmente dichos límites a la versión no apareada y agregar esto al bloque implícito.

Cuestiones relacionadas