Newsgroup: it.comp.java
Titolo: Cast parametrico

Esiste un modo per fare un cast parametrico?
Mi spiego meglio: immaginiamo di avere un array di "MyObjects", classe
astratta, implementata da diverse altre classi. MyObjects ha una proprietą
di tipo stringa che indica che classe si sta usando. C'č un modo per
sfruttare quella stringa ed ottenere l'istanza dell'oggetto non visto come
MyObjects, ma come sottoclasse?
Mi rendo conto che non č molto chiaro... O;-)
Grazie.

              
Network Distributed Applications @ CRS4
Center for Advanced Studies,Research and Development in Sardinia
http://www.crs4.it/~dcarboni/whoami/
     Tel.: ++39 070 2796 303
----------------------------------------------------------------

 quale delle sottoclassi stai usando...
Ma in questo caso non faccio un cast, ho solo la classe... Poi? Cosa ci
metto tra le parentesi del cast?
Grazie!
D

MyObjects, ma come sottoclasse?
No. Se vuoi la usare la classe derivata a compiletime (ad esempio perche' ha un 
metodo in piu') con la sintassi standard, devi conoscerla a compile time. 
Cioe' - se stai pensando a qualcosa tipo 
(nomeClasse)obj
dove nomeClasse viene valutata a runtime, in Java non c'e'. 
Puoi pero' usare la reflection (con tutt'altra sintassi rispetto al cast) per 
creare un'istanza od invocare un metodo. Ma appunto e' una cosa diversa.
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun/

 creare un'istanza od invocare un metodo. Ma appunto e' una cosa diversa.
Ho provato a giocarci un po', ma non ho ottenuto quello che volevo. Mi pare
di aver capito che devo ottenere un Method e poi invocarlo, giusto?
Grazie!

:

Si'. Ottieni un Method da Class, e poi lo invochi su un'istanza con invoke().
Tieni presente pero' che, nel 98% dei casi, e' meglio definire un'interfaccia 
che raggruppa le signature necessarie - a meno che anche queste non siano note 
solo a runtime (per esempio perche' le chiedi all'utente ;-).


 che raggruppa le signature necessarie
Scusa, ma non ho ben chiaro cosa intendi... Invece che la classe astratta
fare un'interfaccia con tutti i metodi di tutte le sottoclassi? Mi pare che
sia un macello...

:

No. Il punto e' semplice: l'unico caso in cui non puoi definire le signature 
dei metodi da invocare nella sottoclasse e' perche' anche queste sono definite 
a runtime.
Se invece sono definibili a compiletime, lo switch e' meglio, oppure la 
definizione di un'interfaccia, se possibile. Lo switch lo incapsuli di solito 
in una classe opportuna, usando un pattern di delegazione, in modo da 
localizzare la necessita' di manutenzione.
Viceversa, un'interfaccia e' possibile quando la tua classe ha un ruolo ben 
definito nel sistema - che e' di norma il design che da' risultati migliori.
Nel caso il metodo da chiamare dipenda dallo stato della classe base, puoi 
usare un pattern di stato, appunto.
A meno di casi rari, la necessita' di uno switch indica cattivo design: il 
fatto che hai una classe derivata di cui 
 - sai che aggiunge un metodo
 - non sai che signature ha quel metodo
indica che c'e' qualche problema.
Ovviamente, non so cosa vuoi fare, quindi potresti trovarti esattamente nell'1% 
di casi in cui tutto cio' e' necessario. Probabilmente sapendolo potrei essere 
piu' preciso. ;-)


 piu' preciso. ;-)
Quello che sto cercando di fare è utilizzare file XML come deposito di
classi Java. Sto utilizzando la libreria JDOM che mi pare la più snella. Il
problema è che da un documento XML, la libreria estrae degli oggetti Element
che non rappresentano una particolare classe Java. Negli element XML ho così
inserito un attributo che indica la classe Java da ricostruire, ma quando
vado a leggere questo attributo non so come utilizzarlo.
Hai qualche idea?
Grazie.
D