Unterschied zwischen Scala die existentielle Typen und der Java-Platzhalter Beispiel?
-
06-07-2019 - |
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
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.