Newsgroup: it.comp.java
Titolo: Errore con cast...sbaglio io?

Allora sicuramente mi  serve una  rispolverata su alcuni concetti
della programmazione ad oggetti (manuali in  ita da consigliarmi?) ma
intanto chiedo il vostro aiuto
Scenario
public class A  implements java.io.Serializable, IA {
numero di variabili private con  getter e setter
}
public interface IA  {
con dichiarati astratti i metodi getter
}
Ho bisogno di una classe tale e quale A ma con una variabile in +.  Non
potendo modificare A ho creato
public  class D extends A implements ID {
con mia variabile e getter e setter
}
public  interface  ID extends IA
{
con astratto il getter
}
Ora nella classe dove tratto questi dati ho
A[] docs =  documentList.value.getA(); // fa varie operazioni e
restituisce un array di A
D doc;
ArrayList a = new ArrayList();
logger.debug("Document retrieved:" + docs.length);
for (int i=0;i<docs.length;i++)
{
           if(map.get(docs[i].getQualcosa)!=null)
	   {
	       doc = new DolDocument();
	       doc = (DolDocument) (docs[i]) ;
doc.setDocumentName(map.get(docs[i].getQualcosa()).toString());
	       a.add(doc);
	   }
}
Ma mi dà ClassCastExcpetion su questo
doc = (DolDocument) (docs[i]) ;
cos'è che sbaglio? non posso  fare un cast del genere?

 cos'è che sbaglio? non posso  fare un cast del genere?
docs[i] è di tipo A. Puoi effettuare un cast del genere, ad esempio, se 
DolDocument eredita da A.
Cmq se non dai nomi di classe significativi è difficile mettere mano, 
fidati.
-- 
Emanuele Torrenti, Registered Linux User #409659
http://torrenti.altervista.org
http://www.sitolecchino.com/Emanuele.html

 fidati.
I nomi significativi ci sono per semplicità li ho abbreviati

 doc = (DolDocument) (docs[i]) ;
DolDocument e' D?
Comunque se docs e' un array di A, non e' un array di D.
Saluti
CarMas

 Comunque se docs e' un array di A, non e' un array di D.
Certo ed è per questo che provo a  fare il cast per  singolo elemento
di array.
Non è possibile fare il cast diretto da A a D visto che quest'ultima
eredita da A?

 eredita da A?
E' evidente che non si puo', anche perche' ti genera ClassCastException :D
Il punto e' che D, estendendo A, e' piu' specializzata, cioe' potenzialmente 
puo' fare piu' cose. Se hai un oggetto "originale" di tipo A, non puoi 
castarlo a D perche' dopo sarebbe lecito andare ad invocarci metodi di D che 
non e' garantito esistano anche in A.
Viceversa, il caso contrario sarebbe possibile.
Saluti
CarMas

 Viceversa, il caso contrario sarebbe possibile.
Capito...quindi se io volessi portare tutti i dati che ci sono in A in
D devo farlo "a mano"?.
L'obiettivo del cast era quello per intenderci. Vorrei portarmi tutti i
dati che ci sono in A in D e poi appunto aggiungere il valore alla
variabile in più che c'è in D:

 I nomi significativi ci sono per semplicità li ho abbreviati
Semplicità? Non si capisce una mazza con i nomi brevi, tra l'altro hai 
pure  commesso un refuso


 pure  commesso un refuso
per semplicità mia  :)
Ti chiedo Scusa la  prossima volta metterò nomi significativi

 D devo farlo "a mano"?.
Praticamente... si'.
Esiste un costruttore di copia nella classe A? Nel caso, sfruttalo... 
altrimenti ti crei un oggetto D e vai di get da A e set in D... 
pazientemente ^^;
Saluti
CarMas

CarMas ha scritto:

...mi armerò di pazienza :D
Grazie mille della spiegazione