Scala-Operatoren als Methoden in Java
-
21-12-2019 - |
Frage
Bei der Bearbeitung von Scala-Objekten (hauptsächlich aus dem scala.collection-Paket) scheinen die über den Operator überladenen Funktionen in Java verfügbar zu sein.
d.h.in Scala
var s = Set(1, 2, 3)
var t = s + 4
var x = s | t
also in Java, schauen scala.collection.Set
In der automatischen Vervollständigung von Eclipse kann ich die Prototypen sehen
Aber ich kann sie nicht richtig verwenden
import scala.collection.Set;
Set<Integer> s = new Set<Integer>();
Set<Integer> t = s.$plus(4); /* compile error with javac, or runtime error with eclipse/*
Wie sollen diese Scala-Methoden in Java verwendet werden?
Lösung
Es scheint, dass man in Java für einige Scala-Schnittstellen nicht programmieren kann!
Dieser Code wird in Sun und Eclipse korrekt kompiliert und ausgeführt.
Beachten Sie die Verwendung von HashSet
auf der linken Seite der Aufgabe
import scala.collection.HashSet;
public class TestCase1 {
public static void main(String[] args) {
HashSet<String> set2 = new HashSet<String>();
HashSet<String> set4 = set2.$plus("test");
System.out.println(set2.size());
System.out.println(set4.size());
}
}
Warum ist das so?
Ich glaube, es hat etwas mit Scalas Fähigkeit zu tun, mehrere Merkmale zu erben, was Java Eclipse nicht versteht.
HashSet erweitert sich beispielsweise AbstractSet, Set, GenericSetTemplate,SetLike, FlatHashTable, CustomParallelizable, Serializable
Einige davon sind Schnittstellen, einige davon sind AbstractClasses.
Der .$plus()
Methode scheint von zu kommen SetLike
, nicht Set
, was erklären würde, warum die Methode auf aufgerufen wird Set
Supertype würde diesen Fehler verursachen.
Trotzdem kann ich mich immer noch nicht darauf beziehen HashSet
mit dem Supertyp SetLike
da das immer noch fehlschlägt, und das ist alles, was ich tun kann.
Ich denke, das Hauptproblem hier besteht darin, dass Elipse den Supertyp irgendwie falsch darstellt, als ob er diese Methoden hätte, was falsch ist.