View Full Version : [java] esercizio upcasting e downcasting
Scrivo ancora perchè non capisco proprio degli esercizi apparentemente elementari...uffaaaaa
data una classe concreta A estesa da due classi concrete B e C e dove C è estesa a sua volta dalla classe D:
definite le seguenti variabili
A a1, a2, a3, a4;
B b;
C c1, c2;
D d;
e istanziate così:
a1 = new A() a2 = new B() a3 = new C() a4 = new D();
b = new B();
c1 = new C(), c2 = new D();
d = new D();
quali tra i seguenti assegnamenti sono validi? quali necessitano di casting e quali non sono validi comunque?
b = a3
a1 = c1
a1 = b
b = c2
d = c1
c2 = d
c1 = a3
in particolare il secondo e il quarto assegnamento mi destano qualche perplessità...
grazie mille! :)
wingman87
01-07-2008, 00:10
Non so se ho interpretato bene il concetto di assegnazione valida o no. Io interpreto come non valido ciò che non funziona anche se potrebbe compilare.
Anche qui, seppure l'esercizio faccia intrecciare i neuroni, il concetto di base è semplice:
- Tenere presente le relazioni "is a"
- Per assegnare come riferimento a una sottoclasse il valore di un riferimento a una sovraclasse (esempio b=a) è necessario il casting, ma questo è valido solo se a conteneva effettivamente un B.
b = a3
Si potrebbe fare con un cast solo se a3 fosse un'istanza di B, quindi quest'assegnazione non è comunque valida
a1 = c1
Posso farlo senza cast perché c1 essendo dichiarato come un C è anche un A (relazione "is a")
a1 = b
Anche questo posso farlo per lo stesso motivo di prima
b = c2
c2 non è sicuramente un B, quindi non posso farlo
d = c1
c1 contiene un C, quindi non posso farlo, se contenesse un D potrei farlo con un cast
c2 = d
d è anche un C, quindi posso farlo
c1 = a3
a3 contiene effettivamente un C, quindi posso farlo con un cast
Spero di non aver detto caxxate ma a quest'ora sarebbe normale :D
intanto grazie mille per avere risposto a entrambi i miei post :) purtroppo in questo esercizio ho fatto uguale a te ma secondo le soluzioni che ho il secondo assegnamento non è valido mentre il 4 lo è...sono convinto sia un errore nel riportare le soluzioni...perchè in particolare il 4 non ha nessun senso!
wingman87
01-07-2008, 18:27
Ciao, per sicurezza ho provato:
class A{}
class B extends A{}
class C extends A{}
class Prova{
public static void main(String[] args){
A a;
B b=new B();
C c=new C();
a=b;
//b=c;
}
}
Questo codice compila ed esegue senza problemi, quindi il secondo è giusto, se togli il commento non compila neanche, quindi il quarto è sbagliato
tranqui era la stessa prova che volevo fare io :D...grazie mille ora sappiamo di essere dei geni e quegli esercizi hanno i risultati sballati :D....grazie ciao!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.