2015-06-22 14 views
5

Von dem, was ich sagen kann, sind diese zwei Funktionen äquivalent:Typen und Generika: Unterschied zwischen `[X <: Int]` und `{type X <: Int}`

def x(xx: X forSome { type X <: Int }): Unit =() 

def y[Y <: Int](yy: Y): Unit =() 

Nach meinen Beobachtungen heutzutage benutzen Leute meistens die zweite Form (die [] benutzt), gleichzeitig sehe ich manchmal Artikel (meistens alte, die existentielle Typen diskutieren), die die erste verwenden (forSome).

Was ist der Grund hinter 2 Notationen? Gibt es Pros/Contras oder Dinge, die man mit dem einen oder anderen nicht machen kann?

+2

So wie Sie bemerkt haben, ist es existentieller Typ, der Alias ​​ist ein Platzhalter in eckigen Klammern; Vor-und Nachteile können nicht beschrieben werden, weil es verschiedene Arten ist; hier können Sie mehr lesen: http://www.drmaciver.com/2008/03/existential-types-in-scala/ (mit Proben), sry für eine nicht konkurrierende Antwort, haben keine Zeit, mein eigenes zu schreiben. – DaunnC

Antwort

1

Sie sind in der Tat sehr ähnlich, und Sie sind nicht allein in der Verwirrung. Der beste Artikel, den ich über existenzielle Typen gelesen habe, gibt Ihnen eine gute Erklärung: here (wie @DaunnC erwähnt). Es gibt tatsächlich auch eine dritte Möglichkeit, dasselbe in Abstract Types auszudrücken.

Als Gründe gehen, würde ich argumentieren, dass einige Dinge nur syntaktischer Zucker und andere Produkte der Sprache der Evolution sind. Scala 2.14 ist geplant, um einige der Redundanz zu adressieren und die Sprache zu vereinfachen. insbesondere:

Vereinfachte und vereinheitlichte Syntax für alle Arten von Informationen Elision: Existentialtypen und Teilaktionen werden mit _ ausgedrückt, forSome Syntax wird eliminiert.

Verwandte Themen