diesen einfachen Code Bedenken Sie:Casting und Vererbung in Java
class A {}
class B extends A {}
public class TestClass {
public static void main(String args[]) {
A[] a, a1;
B[] b;
a = new A[10];
a1 = a;
b = new B[20];
a = b; // 1
b = (B[]) a; // 2
b = (B[]) a1; // 3
}
}
Schauen Sie genau auf Linien, die ich 1,2 und 3. kommentiert Die Linie 1 wird während der Kompilierung erlaubt werden, da Zuordnung von einer Unterklasse Referenz erfolgt zu einer Superklassenreferenz.
Die Umwandlung in Zeile 2 wird benötigt, da eine Oberklassenreferenz einer Unterklassenreferenzvariablen zugewiesen wird. Und das funktioniert zur Laufzeit, weil das Objekt, auf das von a verwiesen wird, tatsächlich ein Array von B (Zeile 1) ist.
Nun, hier ist, wo liegt meine Verwirrung: Zeile 3 wird eine java.lang.ClassCastException werfen. Das bedeutet nun, dass das Programm während der Laufzeit realisiert, dass das tatsächliche Objekt kein Array von B ist, sondern ein Array von A.
Dies ist genau das, was ich nicht verstehe. Erweitert sich B nicht um A? So erfüllt es die Bedingung B IS-A A, richtig? Und sollte daher Zeile 3 während der Laufzeit keine Ausnahme auslösen?
Bitte nehmen Sie sich die Zeit, um den von Ihnen bereitgestellten Code zu formatieren. Es ist * wirklich, wirklich * schwer im Moment zu lesen, ohne Einrückung und mehrere Anweisungen in einer Zeile. Bitte bedenken Sie, dass der Zweck von Stack Overflow darin besteht, eine Sammlung von qualitativ hochwertigen Fragen und Antworten zu erstellen - geben Sie die Zeit an, um Ihre Frage wirklich hochwertig zu machen. –
"So erfüllt es die Bedingung B IS-A A, richtig?" Richtig. Aber was du brauchst, ist "A IS-A B" - aber das hast du nicht. Ich denke, die Verwirrung ist von hier: 'a1 = a; a = b; // 1' - durch Ändern des Verweises 'a' ändert sich' a1' nicht **. Es zeigt immer noch auf das gleiche 'A []'. – Fildor