Newsgroup: it.comp.java
Titolo: Conversione tra riferimenti

Salve, avrei bisogno di sapere se questi due pezzi di codice si equivalgono:
SavingsAccount sAcct = new SavingsAccount(10);
BankAccount bAcct = sAcct;
e
BankAccount bAcct = new SavingsAccount(10);
dove SavingsAccount è sottoclasse rispetto a BankAccount.
Sulle dispense che sto studiando c'è scritto che nel primo caso bAcct 
non può utilizzare i metodi tipici della classe SavingsAccount, mentre 
nel secondo il contrario, ossia che bAcct può utilizzare i metodi tipici 
di SavingsAccount.
Come mai questo?
Grazie mille.
Ciao, Luca.

 Come mai questo?
Cambia dispense(o professore :)
Marco
p.s. Potevi risponderti anche da solo scrivendo 2 rige di codice,provando a 
compilare e ricevendo un bel "cannot resolve symbol"  ;)
-- 
reply: remove .duh.spam
http://cthulhu.users.mcs2.netarray.com/

 codice,provando a compilare e ricevendo un bel "cannot resolve symbol"  ;)
Lo avevo già fatto, solo che mi pareva troppo strana la cosa. Forse ora 
ho capito cosa significa.
Lui probabilmente intendeva che non posso invocare i metodi tipici di 
SavingsAccount in un caso come questo:
BankAccount ba1 = new SavingsAccount();
però posso, ovviamente, invocare almeno quelli di BankAccount. Il fatto 
è che se invoco un metodo che esiste solo in SavingsAccount avrò un 
errore, se ne invoco uno che esiste solo nella BankAccount non avrò 
alcun errore ed il metodo verrà eseguito, ma se invoco un metodo 
presente in entrambi avrò l'esecuzione del metodo della classe alla 
quale la variabile punta. Ossia, se invoco un metodo presente in 
entrambe, allora verrà eseguito il metodo di SavingsAccount.
E' giusto questo? l'ho provato quindi dovrei essere giusto alle corrette 
conclusioni.
Mi ha stupito un poco questo invece:
BankAccount ba = new SavingsAccount(10);
BankAccount ba2 = (BankAccount) ba;
ba2.metodo();
con metodo() definito in entrambe le classi, ho di nuovo l'esezione del 
metodo di SavingsAccount.
Come mai? Non ho eseguito il cast?
Grazie mille per la pazienza.
Luca

 wrote in
news:S07Bb.67058$
AX1.2...@news1.tin.it
: 

Perche' c'e' una differenza tra tipo statico e tipo dinamico di una 
variabile. Leggi
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&frame=right&th=
88df89c45d452783&seekm=Xns92AB6F17BEBCDcristianoxtractorcom%40130.133.1.4
#link14
-- 
You dont know what to do when you dont know what you're doing.
http://space.tin.it/computer/csadun

 #link14
... oppure
http://tinyurl.com/ye3r
:-)
pole
-- 
Note: Some input words use a deprecated author.
Note: Read with -deprecation to understand.

 Come mai questo?
I due metodi sono equivalenti.
-- 
Marco "Duff" Palermo
http://www.marcoduff.com/

 pole
Grazie :-)


 Come mai? Non ho eseguito il cast?
Fare un cast non significa cambiare il tipo di oggetto(ba2 è sempre di tipo 
SavingAccount) ma semplicemente fare una conversione della reference.
Nel caso
SavingsAccount sa = new SavingsAccount(10);
1) BankAccount ba = sa;
2) BankAccount ba2 = (BankAccount) sa;
3) BankAccount ba3 = (BankAccount) ba;
tutte e 3 le references puntano ad oggetti di tipo SavingsAccount.
1) conversione esplicita
2) widening(anche chiamato up cast o safe cast), in questo caso inutile perchè è 
gia applicabile una conversione esplicita
3) humz.. same cast? :) In realtà inutile perchè hai una reference di tipo 
BankAccounte e vuoi trasformarla in BankAccount
Marco
