2012-03-28 3 views
2

Vom Ein Überblick über die Scala Programmiersprache, Second Edition:Java statische Klassenmitglieder und Scala Interoperabilität

// Scala 
object PrintOptions { 
    def main(args: Array[String]): Unit = { 
     System.out.println("Options selected:") 
     for (val arg <- args) 
      if (arg.startsWith("-")) 
       System.out.println(" " + arg.substring(1)) 
    } 
} 

In dem obigen Beispiel ruft das Scala Programmverfahren startsWith und substring von String Dies ist eine in Java definierte Klasse. Es greift auch auf das statische Feld out der Java-Klasse System zu, und ruft seine (überladene) Methode println auf. Dies ist sogar möglich obwohl Scala kein Konzept der statischen Klassenmitglieder hat. Tatsächlich wird jede Java-Klasse in Scala als zwei Entitäten gesehen, eine Klasse , die alle dynamischen Member und ein Singleton-Objekt enthält, das alle statischen Member enthält.

Ich verstehe Übersetzung von Scala Begleitern Objekte in Java-Bytecode, aber ich bin nicht sicher, was genau tut es bedeutet, fett gedruckten Text in der oberen Blockquote für entgegengesetztes Beispiel (von Java nach Scala) „wird in Scala gesehen“.

Bedeutet dies, dass Java-Klassen mit statischen Elementen tatsächlich konvertiert oder in Scala als zwei Entitäten interpretiert werden? Oder sind meine beiden Annahmen falsch?

+1

Bezogen auf Ihre Bearbeitung: Und die Frage ist? ;) – Nicolas

+0

Bedeutet das, dass Java-Klassen mit statischen Elementen tatsächlich konvertiert oder in Scala als zwei Entitäten interpretiert werden? Oder sind meine beiden Annahmen falsch? :) – PrimosK

+0

Frage bleibt gleich .. :) – PrimosK

Antwort

4

Ich denke, Sie könnten durch Java-Annahmen geblendet werden. Betrachten Sie diesen einfachen Code-Snippet:

X.Y() 

Das bedeutet, dass das Verfahren Y auf dem Objekt aufgerufen wird X, oder auf einem anderen Objekt, das X in implizit umgewandelt wurde.

Vielleicht ist das nicht sieht überraschend, oder Sie nichts verkehrt mit, dass sehen, also lassen Sie uns Zustand explizit eine Konsequenz: X wird NIE sein eine Klasse. Sie rufen keine Methoden für Klassen auf, Punkt.

Natürlich stellt dies ein ernsthaftes Interoperabilitätsproblem mit Java in Bezug auf statische Member dar, und deshalb wird behauptet, dass statische Member einer Java-Klasse X als Singleton-Objekt "gesehen" werden: denn sonst wirst du nie in der Lage sein, sie zu benutzen.

Beachten Sie, dass die Singleton-Objekte von Scala echte Objekte sind - sie sind Instanzen von Singleton-Klassen. Java-Klassen mit statischen Elementen geben jedoch keine einzelnen Objekte an.In der Praxis bedeutet dies, dass diese Zeile:

val x = X 

wird funktionieren, wenn X ein Scala Singleton-Objekt ist, aber nicht, wenn es dich um eine Java-Klasse mit statischen Mitgliedern.

1

Es bedeutet einfach, dass scala nichts zu dem ursprünglichen Java-Code ändert, wo statische Mitglieder und nicht-statische Mitglieder in der gleichen Klasse sind.

Also Ihre zweite Annahme ist wahr, die erste ist falsch.

Ich denke, das Buch Verwendung statt gesehen interpretiert weil dieser letzt man eine andere Bedeutung haben kann, wenn man darüber nachdenkt „interpretierte Sprachen“ (was in diesem Zusammenhang bedeutungslos sind).