Warum funktioniert das Hinzufügen eines öffentlichen Felds zu einer anonymen Klasse in Java nicht?

8

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?

    
Jessie A. Morris 23.06.2011, 19:02
quelle

7 Antworten

10

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.

    
user166390 23.06.2011, 19:04
quelle
7

Eine lokale Klasse würde

machen %Vor%     
irreputable 23.06.2011 19:09
quelle
0

fooBar ist eine Referenz auf ein Objekt vom Typ foobar , und solche Objekte haben kein Feld name . So einfach ist das. Und da es ein anonymer Typ ist, ist die einzige Möglichkeit, dieses Feld zu referenzieren, die this -Referenz.

    
Josh Lee 23.06.2011 19:04
quelle
0

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.

    
Herms 23.06.2011 19:05
quelle
0

fooBar type ist foobar , das keine solche Variable hat und daher kann der Code nicht kompiliert werden. Sie können darauf durch Reflexion zugreifen.

    
salman.mirghasemi 23.06.2011 19:06
quelle
0

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";

nicht setzen (und trotzdem nicht)     
zengr 23.06.2011 19:23
quelle
0

Sie können es auch so machen

%Vor%     
Whimusical 28.07.2012 01:30
quelle

Tags und Links