Scala-Generika im Vergleich zu C #

8

Ich wundere mich nur über ein Implementierungsdetail von Scala-Generika. In C # kann man eine Klasse wie folgt deklarieren:

%Vor%

In Scala müsste dasselbe jedoch als

deklariert werden %Vor%

Beachten Sie, dass der Klassenname für mehrere generische Parameter geändert werden muss. Gibt es einen Grund, dass Scala sich entschieden hat, diese Route zu gehen, anstatt die C # one, die ich für eleganter halte? Ich weiß, das ist wahrscheinlich ein ziemlich kleiner Nitpick, aber ich bin ziemlich neugierig auf die Argumentation.

    
om-nom-nom 15.06.2009, 14:41
quelle

3 Antworten

24

Ich weiß, dass Jon Skeets Antwort akzeptiert wurde, aber es ist nicht ganz richtig. Es ist nicht so sehr die JVM, die eine Beschränkung erzwingt, da es die Java-Sprache ist. Scala hat das Entwurfsziel, von Java so einfach wie möglich aufgerufen zu werden, und Java hat kein Konzept, einen Klassennamen basierend auf Typparameter zu überladen. Eine einfache Möglichkeit, das Überladen auf der Basis von Typparametern auf der JVM zu implementieren, wäre beispielsweise eine Namensänderung. Dieser Name Mangling müsste jedoch für Java sichtbar sein und wäre hässlich. In Ihrem Beispiel könnte eine hypothetische Scala zwei Klassen kompilieren, Foo_ $ 1 und Foo_ $ 2. Scala könnte das Mangeln unsichtbar machen. Ein Java-Programmierer würde jedoch all diese Hässlichkeit sehen.

    
James Iry 15.06.2009, 22:05
quelle
4

Es kann durchaus teilweise auf ähnliche Einschränkungen von Java zurückzuführen sein. Wie ich es verstehe, wird Scala meistens auf der JVM verwendet, wo Sie generische Typen nicht durch Arity überladen können.

Es sieht so aus Scala verwendet Type Erasure für seine Generika, sogar im .NET-Port. (Derselbe Artikel erwähnt, dass Scala Generika hatte, lange bevor Java das tat, und selbst wenn Java dies unterstützte, gibt es keine Garantie dafür, dass Scala dies tun würde - sie waren etwas eingeschränkt, als sie das Feature zum ersten Mal entwarfen.)

    
Jon Skeet 15.06.2009 14:59
quelle
2

Ich nehme an, es ist für eine einfachere Zuordnung zu Java gemacht, die die gleiche Einschränkung hat.

Es wäre möglich gewesen, ein paar Namensfehler zu machen, aber um den Preis, die Interoperation mit Java zu erschweren. Meiner Meinung nach haben sie die richtige Entscheidung getroffen.

    
starblue 15.06.2009 15:00
quelle

Tags und Links