2012-06-11 14 views
5

den folgenden scala Code Gegeben:Warum definiert Scala einen Operator "+ =" für Short- und Byte-Typen?

var short: Short = 0 
short += 1  // error: type mismatch 
short += short // error: type mismatch 
short += 1.toByte // error: type mismatch 

ich nicht die zugrunde liegende Typisierung in Frage - es ist klar, dass "Short + Wert == Int".

Meine Fragen sind:
1. Gibt es überhaupt eine Möglichkeit, dass der Operator verwendet werden kann?
2. Wenn nicht, warum ist der Operator dann für Short & Byte verfügbar?

[Und durch die Erweiterung * =, | = & = etc.]

+0

Eigentlich hat Short keine Methode "+ =" oder "* =", Sie können das Dokument für Short http://www.scala-lang.org/api/current/index.html#scala suchen. Kurz. x IrgendeinOperator = y wird vom Compiler automatisch in x = x-Operator y übersetzt. – Eastsun

+0

@Eastsun Aber auch nicht Int :-) 'a op = b' ist syntaktischer Zucker für die erweiterte Form:' a = a op b', was den Typfehler erklärt (Short + Short -> Int). Es erklärt nicht, warum die Entscheidung getroffen wurde oder welchen Nutzen dieses Konstrukt haben könnte oder nicht. (In C# ist es vollkommen legal, "byte + = 1", aber nicht "byte = byte + 1" zu tun, und das Verhalten ist im Standard spezifisch - es gibt eine implizite Rückübertragung auf den LHS-Typ in C#). –

+0

@pst Ja, du kannst dasselbe in Java machen wie in C# (Wenn ich mich richtig erinnere.) – Eastsun

Antwort

1

Das Problem scheint zu sein, dass "+ (Short)" auf Short-Klasse ist wie folgt definiert:

def +(x: Short): Int 

So es gibt immer einen Int zurück.

Angesichts den + = „Operator“ zu verwenden, das Sie am Ende nicht in der Lage zu sein, weil die + Operation auf ein Int auswertet, die (natürlich) nicht auf den „kurzen“ var in der entzuckert Version zugeordnet werden:

short = short + short 

Was Ihre zweite Frage ist es „verfügbar“, weil, wenn der scala Compiler Ausdrücke wie findet:

x K= y 

und wenn x ein var ist und K ist jeder symbolischer Operator und es gibt K-Verfahren in x dann übersetzt oder übersetzt der Compiler es zu:

x = x K y 

Und dann versucht, die Kompilierung damit fortzusetzen.