Klassen Anonyme Klassen: Zugänglichkeit neuer Methoden

robinkognito

Mitglied
Hey, um folgendes geht es:

Wir behandeln in der Uni in Programmieren 2 gerade verschiedene Java-Features und haben uns in diesem Rahmen die anonymen Klassen etwas genauer angeschaut.

Dazu hieß es u.A., dass man überschriebene Methoden der Oberklasse oder des Interfaces problemlos abrufen könne, es bei neu implementierten Methoden allerdings etwas schwieriger sei und nur über spezielles Casting funktionieren würde.

Das habe ich eben Mal selbst ausprobiert und bei mir ging es komischerweise problemlos ohne Casting. Also zu Recherchegründen Mal ChatGPT und Google angeworfen und darauf gestoßen, dass es möglicherweise in der Jshell, die ich zum Testen verwendet habe, erlaubt sein könne, jedoch nicht in einem normalen Java-Programm (hier dann ein Compile-Fehler in Bezug auf den Typen).

Also habe ich das ganze in eine Main eingesetzt, kompiliert und nochmal ordnungsgemäß ausgeführt, aber auch hier funktioniert das Abrufen neu implementierter Methoden ohne Fehler.

Hier jetzt erst mal der Code
Java:
public class Main {
    public static void main(String[] args) {
        class Pigeon {
            void fly() { System.out.println("flies around"); }
        }
        var bird = new Pigeon() {
            void flyHigh() { System.out.println("flies even higher"); }
        };
        bird.flyHigh();
    }
}

So, mein letzter Versuch war dann noch: Möglicherweise sind die Informationen der VL und meiner restlichen Quellen veraltet und dort wird ohne var gearbeitet, in welchem Fall explizites Casting notwendig sein könnte?

Hier kam ich allerdings auch zu der Information, dass der Instanz der anonymen Klasse nur implizit der Typ der Oberklasse zugewiesen würde, insofern scheinbar Fehlanzeige.

Kann mir bitte jemand erklären, wieso dieser Code bei mir gültig ist, während sämtliche Quellen das verneinen?
 
Zuletzt bearbeitet:
Kann mir bitte jemand erklären, wieso dieser Code bei mir gültig ist, während sämtliche Quellen das verneinen?
Das Zauberwort lautet hier Typinferenz. Du verwendest hier var für die Deklaration der Variablen bird. Der Compiler leitet nun den Typ ab - und der ist nicht Pigeoon, sondern die von Pigeon abgeleitete anonyme Klasse. Wenn Du var durch Pigeon ersetzt, wirst Du feststellen, dass der Code nicht mehr übersetzbar ist.

Nachtrag:
Hier kam ich allerdings auch zu der Information, dass der Instanz der anonymen Klasse nur implizit der Typ der Oberklasse zugewiesen würde, insofern scheinbar Fehlanzeige.
Es geht um den statischen Typ (zur Übersetzungszeit). Der Typ Pigeon hat die Methode flyHigh() nicht, daher kannst Du auf einer Variablen vom Typ Pigeon die Methode flyHigh() nicht aufrufen. Bei var ist die Variable nicht vom Typ Pigeon, sondern vom Typ der anonymen Klasse.

Ach so: casten ist hier nicht notwendig, weil eine Subklasse zuweisungskompatibel zu jeder ihrer Oberklassen ist ("is-a"-Beziehung). Umgekehrt ist ein Downcasting zur Übersetzungszeit auf einen anonymen Typ nicht möglich (wie willst Du den anonymen Typ auch angeben?). Zugriff via Reflection ginge natürlich.
 
Zuletzt bearbeitet:
Das Zauberwort lautet hier Typinferenz. Du verwendest hier var für die Deklaration der Variablen bird. Der Compiler leitet nun den Typ ab - und der ist nicht Pigeoon, sondern die von Pigeon abgeleitete anonyme Klasse. Wenn Du var durch Pigeon ersetzt, wirst Du feststellen, dass der Code nicht mehr übersetzbar ist.

Nachtrag:

Es geht um den statischen Typ (zur Übersetzungszeit). Der Typ Pigeon hat die Methode flyHigh() nicht, daher kannst Du auf einer Variablen vom Typ Pigeon die Methode flyHigh() nicht aufrufen. Bei var ist die Variable nicht vom Typ Pigeon, sondern vom Typ der anonymen Klasse.

Ach so: casten ist hier nicht notwendig, weil eine Subklasse zuweisungskompatibel zu jeder ihrer Oberklassen ist ("is-a"-Beziehung). Umgekehrt ist ein Downcasting zur Übersetzungszeit auf einen anonymen Typ nicht möglich (wie willst Du den anonymen Typ auch angeben?). Zugriff via Reflection ginge natürlich.

Damit wäre alles beantwortet, ich danke dir für deine Hilfe! 🙂
 

Zurück
Oben