Ich versuche herauszufinden, wie man eine Methode erstellt, die ein verschachteltes Objekt als Argument akzeptiert. Für eine verschachtelte Klasse kann ich Folgendes tun:
%Vor%Wenn ich jedoch so etwas mit einem Objekt versuche, bekomme ich einen Fehler:
%Vor% Was sollte der Typ des Arguments für die Methode sein, um dies zu erreichen? Ich möchte auch auf den Typ von Inner
-Objekt verweisen, verallgemeinere das Argument nicht, um Any
zu sagen.
Inner
ist ein Objekt, daher ist es kein Typ und kann nicht als Typ verwendet werden. Der Typ von Inner
ist Inner.type
. Es bedeutet, in Ihrem Beispiel. Leider hat jede Instanz von Outer ein eigenes Inneres und der Typ Outer#Inner.type
kann nicht verwendet werden, da es nicht stabil ist. Ein Workaround ist die Verwendung von this.Inner.type
.
Aber es bedeutet, dass Sie als Inneres Objekt der Instanz, in der Sie method
aufrufen, nur als Parameter übergeben können.
Ein einfaches Beispiel, um zu veranschaulichen, was hier passiert (in der REPL):
%Vor%Wie Nicholas sagt, Inner ist kein Typ, also kann man es nicht so verwenden.
Ich habe versucht, Ihre Motivation zu verstehen, und habe so etwas herausgefunden:
%Vor%Das ist ein bisschen sinnlos, da wir direkt auf Inner verweisen würden - schließlich gibt es nur eines davon:
%Vor%Ich vermute, dass das, was Sie tun wollen, ein Inneres von jedem Äußeren annehmen soll. Wir können den Typ einer solchen Sache überprüfen:
%Vor%Wir könnten also erwarten, dass wir so etwas tun können:
%Vor%Dies kann jedoch nicht kompiliert werden. Ich bin mir nicht sicher warum. Geben Sie Aliase zur Rettung ein!
%Vor% Ich schätze, es ist nur eine Einschränkung des Parsers, dass er etwas vom Format A#B.type
nicht lesen kann. Sie könnten möglicherweise eine Fehleranforderung senden.
Jede Scala object
hat ihren eigenen Typ und es gibt genau einen Wert dieses Typs - das Objekt selbst. Daher ist der Typ einer Scala object
nicht nützlicher als der Typ Unit
.
Beispiel: Sie haben eine object A
und deklarieren eine Methode oder Funktion, die einen A.type
-Parameter akzeptiert:
Da immer genau ein Wert vom Typ A.type
existiert, verlieren wir keine Allgemeinheit, indem wir stattdessen direkt auf die Methode foo
verweisen.
Wenn Sie dies wünschen, ist es wahrscheinlicher, dass das, was Sie wirklich abstrahieren wollen, eine Eigenschaft oder Basisklasse des Objekts ist:
%Vor%