Ich habe 2 einfache Methoden in einer scala Bibliotheksklasse:
%Vor% Das alles wird schön zusammengestellt. Ich stelle das dann in eine Bibliothek foo.jar
und versuche und kompiliere das folgende Stück Java:
Ich kann die beanstandete Zeile durch ersetzen:
%Vor%Aber das scheint den Punkt zu besiegen. Wie kann ich es von Java aus mit Java varargs-artiger Syntax aufrufen?
Wenn Sie in 2.8 (nicht etwa 2.7) eine varargs-Methode von einem Java-Parent überschreiben oder eine varargs-Methode von einer Java-Schnittstelle implementieren, generiert der Scala-Compiler zwei Methoden, eine für Scala, eine für Java. Der Java-Code - wie Sie selbst sehen können, indem Sie den Bytecode untersuchen - nimmt einfach das Varargs-Array und wickelt es um und übergibt das WrappedArray dann an die Scala-Version, die eine Seq erwartet.
Wenn es eine Möglichkeit gibt, den Compiler zu zwingen, die Weiterleitung unter anderen Umständen zu erzeugen, weiß ich nichts darüber. Ich bezweifle, dass es existiert. Scheint so, als würde es eine vernünftige Verbesserungsanfrage sein, eine Art zu geben, danach zu fragen (eine Annotation, denke ich).
Nicht unbedingt sicher, aber ich denke Varargs in Scala verwendet Sequenzen und unterscheidet sich von der Java-Implementierung. Ich denke, der einfachste Weg, um das zu erreichen, was Sie wollen, ist die Unterklasse der Foo-Scala-Klasse in Java und das Hinzufügen einer Balkenmethode, die ein Java-Vararg, d. H.
, benötigt %Vor%Die JavaFoo vararg-Methode kann dann unter Verwendung der Vararg-Syntax in Java aufgerufen werden.
Ich hoffe, es hilft:)
Lesen Sie die Antwort auf diese Frage :
Sie können% code% verwenden, um scala anzuweisen, beide Methoden zu generieren:
%Vor%Trotz des nützlichen Hinweises zur Verwendung einer Java-Schnittstelle , um den Scala-Compiler dazu zu zwingen, "kompatibel" zu sein, konnte ich meinen Code einfach nicht zum Laufen bringen. Irgendwann dämmerte es mir, dass die Methoden auf einem Scala -Objekt deklariert wurden, was bedeutet, dass sie tatsächlich statisch sind und Sie keine statischen Methoden in einer Schnittstelle angeben können, so ignorierte der Compiler im Grunde nur die Tatsache, dass Das Objekt hat die Schnittstelle implementiert. Zum Glück für mich gibt es einen Workaround. Anstatt die statische Methode direkt von Java wie folgt aufzurufen:
%Vor%Sie müssen es so nennen:
%Vor%Dies bedeutet, dass Sie tatsächlich auf das Singleton-Objekt als Instanz zugreifen, auf das von einem statischen Feld verwiesen wird, und da es eine Instanz ist, und implementiert die Java-Schnittstelle dort Der Compiler erledigt seine Aufgabe korrekt und implementiert die varargs-Methode, so dass Java sie als varargs bezeichnen kann.
Ich persönlich denke, das sollte als ein Scala-Compiler-Bug betrachtet werden.
Tags und Links scala java interop variadic-functions