Ich versuche Scala zu lernen, also habe ich beschlossen, Datenstrukturen damit zu implementieren. Ich habe mit dem Stack begonnen. Ich habe die folgende Stapelklasse erstellt.
%Vor%I Versuchen Sie dann, diese Klasse in meiner Java-Klasse mit dem folgenden
zu initialisieren %Vor%Allerdings wurde mir gesagt, dass der Konstruktor nicht existiert und dass ich ein Argument hinzufügen sollte, das zu Manifest passt. Warum passiert das und wie kann ich das beheben?
Alexey gab Ihnen die richtige Erklärung, aber es ist definitiv möglich, Manifest in Ihrem Code zu erstellen (Sie brauchen nur ein java.lang.Class
-Objekt, das Sie einfach in Java erstellen können).
Zuerst sollten Sie eine Java-freundliche Factory-Methode zum Companion-Objekt von Stack hinzufügen:
%Vor% Diese Methode generiert das entsprechende Manifest (aus einer Java-Klasse) und übergibt es explizit an den Konstruktor Stack
. Sie können es dann ohne Probleme aus Java verwenden:
Dies passiert, weil ein Kontext, der wie [A : Manifest]
gebunden ist, nur eine Kurzform für ein implizites Konstruktorargument ist. Ihre Klasse wird also "wirklich" als class Stack[A]()(implicit m: Manifest[A]) {
deklariert. Da die einzige Möglichkeit, ein Manifest
zu erstellen, Compiler-Magie ist (so weit ich weiß), kann man das nicht von Java aus tun und kann dort kein Stack
konstruieren.
Sie können den Entwurf entweder ändern, um Manifeste zu vermeiden, oder Instanzen von Stack
im Scala-Code erstellen und diese nur aus Java verwenden.
Folgen Sie paradigmatischer Antwort, Sie können auch einen Konstruktor für Ihre Klasse erstellen:
%Vor%das kann dann aus Java aufgerufen werden:
%Vor%Trotzdem wird das Problem mit generischen Typen wie Stacks von Strings auftreten. Dazu geben Sie in diesen Thread aussehen: Ссылка