Ich habe eine Beispielklasse wie unten definiert:
%Vor%Später, wenn ich das versuche:
%Vor%Ich bekomme eine Fehlermeldung, dass das Namensfeld nicht existiert. Warum?
Weil der Typ der Variablen "fooBar"
ist FooBar
(der Laufzeittyp des Objekts in dieser Variable ist) das der anonymen Klasse, die FooBar
implementiert, was auch ein Subtyp von FooBar
ist) ...
... und der Typ FooBar
hat dieses Mitglied nicht. Daher ein Kompilierungsfehler. (Denken Sie daran, dass die Variable "fooBar"
ein beliebiges Objekt enthalten kann, das FooBar
entspricht, auch solche ohne name
, und daher lehnt der Compiler den Code ab, der nicht typsicher ist.)
Bearbeiten: Eine Lösung finden Sie in der Antwort von uninputable, die eine Local Class Declaration zum Erstellen eines neuen benannten Typs (um den anonymen Typ im Beitrag zu ersetzen).
Java unterstützt keinen Weg, dies zu tun (hauptsächlich: Java unterstützt keine nützliche Typinferenz), obwohl das Folgende funktioniert, auch wenn es nicht sehr nützlich ist:
%Vor%Glückliche Kodierung.
Sowohl Scala als auch C # unterstützen die erforderliche Typinferenz und damit anonyme Typspezialisierungen von lokalen Variablen. (Obwohl C # die Erweiterung vorhandener Typen nicht anonym unterstützt). Java jedoch nicht.
Sie erstellen ein Objekt vom Typ foobar
. Der Compiler kennt nur die Member, die für die Klasse / interface foobar
definiert wurden.
Denken Sie daran, Java ist eine statische Sprache, nicht dynamisch. Das Objekt wird nicht zur Laufzeit auf das Vorhandensein überprüft. Es prüft zur Kompilierzeit anhand der Typdeklaration.
fooBar
type ist foobar
, das keine solche Variable hat und daher kann der Code nicht kompiliert werden. Sie können darauf durch Reflexion zugreifen.
Wie alle sagten, ist dies auf statische Typisierung zurückzuführen, und FooBar
class enthält nicht name
. Also wird es nicht funktionieren.
Ich wollte auf die vorgeschlagene Verwendung der anonymen Klasse hinweisen.
Anonyme Klasse (oder nahe bei Closures, vielleicht Lambda. Ähnlich, aber nicht gleich) stammen aus dem funktionalen Programmierparadigma, wo die Zustände unveränderlich sein sollten.
Warum sollten Sie solche Klassen benutzen? Wenn Sie eine schnelle und kurze Sache brauchen, die nicht unbedingt in eine komplette Klasse gehört. Beispiel:
%Vor%Es ist wichtig, dass Sie Ihre Implementierung nur einer Funktion / Klasse hinzufügen.
Die scope of the variables defined in the Anonymous class (or closed-over function) should only be used inside the Anonymous class
, es kann nicht von anderem Programmcode aus zugegriffen werden.
Deshalb sollten Sie fooBar.name = "Test";
Tags und Links java anonymous-class