Frage

Ein bisschen spezifischer als Stack-Overflow-Frage Was ist eine existenzielle geben?, was ist der Unterschied zwischen Scala existentielle Typen und Java ist wildcard, prefereably mit einigen illustrativen Beispiel?

In allem, was ich bisher gesehen habe, scheinen Sie ziemlich gleichwertig.

Ein paar Referenzen.Martin Odersky Sie erwähnt;Google top-hit für meine Frage:

MO: Die original-wildcard design ...inspiriert wurde existenzielle Typen.In der Tat die ursprünglichen Papier hatte eine Codierung in existenzielle Typen.Aber dann, wenn die tatsächliche endgültige design wurde im Java -, diese Verbindung verloren habe, ein wenig

War es hilfreich?

Lösung

Das ist Martin Odersky die Antwort auf die Scala-users mailing Liste:

Die ursprüngliche Java-wildcard-Typen (wie beschrieben in der ECOOP Papier Igarashi und Viroli) waren in der Tat nur Kürzel für existenzielle Arten.Ich mir gesagt, und ich habe gelesen, in den NARR '05 Papier auf Wilde FJ, die die Finale version von wildcards hat einige subtile Unterschiede, mit existenzielle Typen.Ich würde nicht genau wissen, in welchem Sinne (Ihre Formalismus ist zu weit entfernt von der klassischen existentielle Typen feststellen, wo genau der Unterschied), aber vielleicht ist eine sorgfältige Lesen der Wilden FJ Papier würde etwas Licht auf Sie.

Es scheint also So, dass Scala existentielle Typen und Java-Platzhalter sind Art-äquivalent

Andere Tipps

Sie sollen gleich sein, da ihr Hauptzweck mit Java Platzhalter ist die Interaktion.

Sie sind sehr ähnlich, aber Scala Existenz Art soll mächtiger sein. Zum Beispiel Existenztyp der Scala kann sowohl obere und untere begrenzt, während der Platzhalter nur Java kann oberen gebunden sein.

Zum Beispiel in Scala:

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

nimmt die foo eine Liste der Parameter, der eine untere Grenze von Int hat.

Eine Möglichkeit, detailliertere Antwort von Martin Odersky (der Rest kann hier ):

  

Scala braucht existentielle Typen für im Wesentlichen drei Dinge. Der Erste   ist, dass wir ein Gefühl für Java Platzhalter machen müssen, und   existentielle Typen ist der Sinn, den wir von ihnen zu machen. Die zweite ist, dass wir   muß ein Gefühl für Java rohe Typen machen, weil sie auch sind   noch in den Bibliotheken, die ungenerified Typen. Wenn Sie einen Java roh erhalten   Typ, wie java.util.List ist es eine Liste, in der Sie nicht wissen, die   Elementtyp. Das kann auch in Scala durch eine existentielle dargestellt werden   Art. Schließlich müssen wir existentielle Typen als eine Möglichkeit, zu erklären, was geht   auf der VM auf dem hohen Niveau von Scala. Scala verwendet das Löschen Modell   von Generika, wie Java, so sehen wir nicht die Parameter des Typs   mehr, wenn Programme ausgeführt werden. Wir haben Löschung zu tun, weil wir brauchen   die Interoperabilität mit Java. Aber was passiert, wenn wir Reflexion tun   oder wollen zum Ausdruck bringen, was in der VM auf das geht? Wir müssen in der Lage sein   darstellen, was die JVM die Typen nicht verwenden wir in Scala haben, und   existentielle Typen lassen Sie uns das tun. Sie lassen Sie über Typen sprechen, wo   Sie wissen nicht, bestimmte Aspekte dieser Typen.

Die List[_] Notation (die als andere Antworten darauf hin, ist ein leistungsfähiger Analog-Java List[?]) ist ein degenerierter Fall der allgemeinere Vorstellung einem existentiellen Typ in Scala.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top