2009-06-23 10 views
29

Un peu plus spécifique que Stack Overflow question What is an existential type?, quelle est la différence entre types existentiels de Scala et Java générique site, de préférence avec quelques exemples d'illustration?Différence entre les types existentiels de Scala et le joker de Java par exemple?

Dans tout ce que j'ai vu jusqu'ici, ils semblent être assez équivalents.

Quelques références. Martin Odersky mentions them; top hit for my question Google:

MO: La conception générique d'origine ... a été inspiré par les types existentiels. En fait, l'article original avait un encodage dans les types existentiels. Mais quand la conception finale réelle est sorti en Java, cette connexion se perd un peu

+0

imho, fotNelton semble faire quelques ajouts pertinents omis par les autres, ce qui serait intéressant d'en savoir plus sur. Il serait intéressant d'expliquer plus clairement la deuxième partie de la citation ... – ib84

Répondre

13

C'est la réponse de Martin Odersky sur la liste de diffusion Scala utilisateurs:

Les types génériques Java d'origine (comme décrit dans le document ECOOP par Igarashi et Viroli) étaient en effet seulement sténographies pour existentiels types. On me dit et j'ai lu dans le document FOOL '05 sur Wild FJ que la version finale des caractères génériques a quelques différences subtiles avec types existentiels. Je ne saurais pas exactement dans quel sens (leur formalisme est trop éloigné des types existentiels classiques pour être en mesure d'identifier la différence), mais peut-être une lecture attentive du papier FJ ferait la lumière sur elle.

Il ne semble que les types existentiels et wildcards Java Scala sont de type de équivalent

+2

Un lien vers la conversation entière serait plus utile –

+0

Il n'y avait pas beaucoup plus que cela –

6

Ils sont censés être équivalents, comme leur objectif principal est en interaction avec les caractères génériques de Java.

+0

J'ai ajouté le commentaire de Martin Odersky à ma question initiale. En lisant sa réponse à Bill Venners, il semble que les types existentiels ne soient pas équivalents aux caractères génériques. Certes, je suis à peu près sûr d'avoir lu quelque chose il y a quelque temps, en disant que Scala * n'avait pas de caractères génériques (ce qui n'était pas le cas à l'origine) était une chose positive. –

+0

Quelqu'un m'a fait remarquer qu'il était probablement en train de gonfler le fait que Scala n'a pas de types * raw * –

+0

@oxbow_lakes, est-ce que List [_] 'est considéré comme une liste brute dans Scala? –

6

Ils sont très similaires mais le type existentiel de Scala est censé être plus puissant. Par exemple, le type existentiel de Scala peut être à la fois supérieur et inférieur tandis que le joker de Java ne peut être que supérieur.

Par exemple, dans Scala:

scala> def foo(x : List[_ >: Int]) = x 
foo: (x: List[_ >: Int])List[Any] 

foo prend une liste de paramètres qui a une limite inférieure de Int.

4

Une façon de réponse plus détaillée par Martin Odersky (le reste se trouve here):

Scala a besoin pour les types existentiels essentiellement trois choses. Le premier est que nous devons donner un sens aux jokers de Java, et les types existentiels sont le sens que nous en avons. La seconde est que nous avons besoin de donner un sens aux types bruts de Java, car ils sont également dans les bibliothèques, les types non générés. Si vous obtenez un type Java brut, tel que java.util.List, il s'agit d'une liste dans laquelle vous ne connaissez pas le type d'élément . Cela peut également être représenté dans Scala par un type existentiel .Enfin, nous avons besoin de types existentiels pour expliquer ce qui se passe dans la VM au niveau haut de Scala. Scala utilise le modèle d'effacement de génériques, tout comme Java, donc nous ne voyons plus les paramètres de type lorsque les programmes sont exécutés. Nous devons faire un effacement car nous avons besoin de pour interopérer avec Java. Mais alors que se passe-t-il lorsque nous faisons la réflexion ou que voulez-vous exprimer ce qui se passe sur le dans la VM? Nous devons être en mesure de représenter ce que fait la JVM en utilisant les types que nous avons dans Scala, et types existentiels laissez-nous faire cela. Ils vous permettent de parler de types où vous ne connaissez pas certains aspects de ces types.

0

La notation List[_] (qui, comme les autres réponses soulignent est un analogue plus puissant de Java de List[?]) est un cas dégénéré de la more general notion d'un type existentielle Scala.