ok, hab mal wieder den Fehler gemacht, vor dem zweiten Kaffee am Morgen zu posten.
Dachte aus irgend einem Grund, dass der Compiler sich da aufregt.
So falsch lagst Du auch nicht. Der Compiler meckert ja auch schon, wenn klar ist, dass da etwas gar nicht sein kann.
Das führe ich auch einfach einmal im Detail aus (Nicht für Dich
@Neumi5694 - Du wirst das vermutlich schon kennen und Dich längst erinnert haben! Aber für den TE ist das durchaus wichtig denke ich mal):
Wenn etwas eine Klasse A zurückgibt und du es nach Klasse B casten willst und die Klassen nicht voneinander erben, dann wird der Compiler da schon meckern. Konkretes Beispiel: Methode gibt ein Integer zurück und du machst ein Cast zu String: Bei Integer kann nichts zurück gegeben werden, das zu einem String gecastet werden kann (*). Das sind dann "incompatible Types":
java: incompatible types: java.lang.Integer cannot be converted to java.lang.String
Aber wenn die Klassen von einander erben, dann geht sowas natürlich. Integer erbt von Number. Also nehmen wir eine Methode, die ein Number[] zurück gibt. Diese kann dann z.B. ein Integer[] zurück geben:
public static Number[] test() { return new Integer[]{1}; }
Und ein Code wie:
Integer[] t = (Integer[]) test();
würde funktionieren.
Wenn man die Methode nun in folgendes umändert:
public static Number[] test() { return new Double[]{1.0}; }
dann ist die Methode weiter valide. Aber bei der Ausführung schlägt der Cast natürlich fehl, denn ein Double[] kann nicht in ein Integer[] gecastet werden.
(*) Die Null-Referenz ist hier natürlich eine Ausnahme. Aber die nimmt eine besondere Position ein, die ich aber nicht näher beleuchten werde. (Wenn das aber wirklich interessieren sollte, dann kann ich gerne einen separaten Thread mit den Stellen der JLS bringen und diese etwas ausführen. Aber das sind Formalien, die nicht wirklich interessant sind wenn man einfach nur etwas in Java programmieren will.)