48 votes

Identifier et décrire les contraintes de type génériques de Scala

J'ai vu "<:" et ">:" et "<%" etc., quelqu'un peut-il donner (ou localiser) une bonne description de ceux-ci? Quelles sont les contraintes possibles, que font-ils, et quel est un exemple de quand les utiliser?

70voto

Raph Levien Points 3518

S <: T signifie qu' S est un sous-type d' T. Il est également appelé un supérieur de type lié. De même, S >: T signifie qu' S est un supertype de T, un type inférieur lié.

S <% T est un point de vue lié, et exprime S doit venir équipé avec une vue que les cartes de ses valeurs, des valeurs de type T.

C'est déroutant pour moi aussi, et j'ai une Maîtrise de langages de programmation de Berkeley.

55voto

Kevin Wright Points 31665

Il existe deux types de bêtes ici, mais ils sont tous savent que "limites" et pas des "contraintes"...

Les premières sont le type de limites:

  • <: - uppper type lié
  • >: - type inférieur lié

Ces sont essentiellement les mêmes que super et extends en java, et sera effectivement codé en tant que tel dans le bytecode généré, ce qui est bon pour l'interopérabilité :)

Vient ensuite le sucre syntaxique:

  • <% - vue lié
  • : - contexte lié

Ce ne sont PAS encodés de façon que Java pourrait éventuellement comprendre (bien qu'ils soient représentés dans la scala de signature, une annotation que la scala ajoute à toutes les classes pour aider le compilateur, et qui est finalement la base d'un Scala de réflexion de la bibliothèque)

Ces deux sont des convertis de paramètres implicites:

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

Pour cette raison, vous ne pouvez pas combiner vos propres implicites, soit avec vue sur les limites ou le contexte limites, comme Scala permet uniquement à un bloc de étiqueté comme implicite pour toute fonction ou d'un constructeur.

Si vous avez besoin d'utiliser votre propre implicites, alors vous devez d'abord convertir manuellement ces limites à la version sans sucre et les ajouter à l'implicite bloc.

5voto

Dan_Chamberlain Points 161

Voir la Scala de programmation de O'Reilly . Commencez aux limites de type . Je pense que cela explique très bien les limites de type et de vue.

1voto

Don Mackenzie Points 3639

En ce qui concerne l'explication des limites de la vue et du contexte, jetez un coup d'œil à cette réponse d'une richesse caractéristique fournie par Daniel à la question suivante:

http://stackoverflow.com/questions/4465948

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X