Was ist der Typ eines verschachtelten Objekts in scala?

7

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.

    
Emil H 10.02.2012, 07:38
quelle

3 Antworten

12

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 .

%Vor%

Aber es bedeutet, dass Sie als Inneres Objekt der Instanz, in der Sie method aufrufen, nur als Parameter übergeben können.

    
Nicolas 10.02.2012, 07:48
quelle
7

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.

    
Submonoid 10.02.2012 08:56
quelle
0

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:

%Vor%

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%     
Emil Lundberg 24.05.2016 16:38
quelle

Tags und Links