Rzutowanie na niższą klasę

0

W jaki sposób rzutować obiekt klasy bazowej na klase podrzędną

public class Main {
	
	public static void main(String[] args) {
		
				
		Student st = new Student();
		Uczen ucz = new Uczen();
		
		st = (Student) ucz;
		
	}

}
class Uczen{
	String name;
}
class Student extends Uczen{
	
	int index;
	
}

W tym przykładzie rzutowany jest obiekt, który ma mniej informacji na obiekt, który ma więcej informacji. Nie ma błędu kompilacji jest za to błąd wykonania.

Exception in thread "main" java.lang.ClassCastException: myPackage.Uczen
at myPackage.Main.main(Main.java:39)

W książce jest napisane, że przy takim rzutowaniu obiekt rzutowany otrzymuje metody i zmienne klasy podrzędnej. Proszę o wyjaśnie

0

no nie da się tak i tyle
ładny przykład:

public class RunTimeCastDemo{
	public static void main(String args[]){
		X x = new X();
		Y y = new Y();      
		Z z = new Z();      

		X xy = new Y();  // compiles ok (up the hierarchy)
		X xz = new Z();  // compiles ok (up the hierarchy) 
//		Y yz = new Z();   incompatible type (siblings)

//		Y y1 = new X();   X is not a Y
//		Z z1 = new X();   X is not a Z
		        
		X x1 =  y;       // compiles ok (y is subclass of X)
		X x2 =  z;       // compiles ok (z is subclass of X)

		Y y1 = (Y) x;    // compiles ok but produces runtime error
		Z z1 = (Z) x;    // compiles ok but produces runtime error
		Y y2 = (Y) x1;   // compiles and runs ok (x1 is type Y)
		Z z2 = (Z) x2;   // compiles and runs ok (x2 is type Z)
//		Y y3 = (Y) z;     inconvertible types (siblings)
//		Z z3 = (Z) y;     inconvertible types (siblings)

		Object o  = z;
		Object o1 = (Y)o; // compiles ok but produces runtime error

	}
}
0

Rzutować można tylko w górę hierarchii klas. Inaczej mówiąc każdy Student JEST uczniem, ale uczeń NIE MUSI być studentem.
Poza tym takie działanie jest pozbawione sensu ponieważ możesz zawsze napisać w ten sposób:

public class Main {

    public static void main( String[] args ) {

        Student st = new Student();
        Uczen ucz = new Student();
        st = (Student) ucz;
    }
}

class Uczen {
    String name;
}

class Student
    extends Uczen {

    int index;

}
0

Dziękuje za wszystkie odpowiedzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1