PDA

Visualizza la versione completa : [JAVA] Una questione di casting...


ghinz
21-11-2002, 11:48
Ho una lacuna sul concetto di casting... :dhò:
Allora: facciamo finta di avere una hashtable piena, quando estraggo un valore ottengo un 'Object'

Object value = hash.get(key);

Questo Object potrebbe essere un'istanza di una qualsiasi classe, come faccio ad ottenere proprio un oggetto di quella classe?

Es. se fosse una data, potrei fare così:

if (value instanceof java.util.Date) {
Date data = (Date)value;
}

Ma se non so a priori che tipo di oggetto è come faccio? Non posso fare 2000 if per confrontarlo con tutte le classi che uso nel mio programma...
Sarò riuscito a spiegarmi?

Thanks

lelefante
21-11-2002, 12:05
Per sapere a che tipo di oggetto ti stai riferendo puoi usare il metodo getClass() che ti restituisce, appunto, la classe dell'oggetto in questione.

ghinz
21-11-2002, 12:16
Ok, questo lo sapevo, infatti se scrivo

Object value = hash.get(key);
Class classe = value.getClass();
System.out.println(classe.forName());

mi dovrebbe stampare "java.util.Date".

Il problema è: so che value (che è un oggetto Object), è in realtà una istanza della classe Date, come faccio a farlo diventare a tutti gli effetti un oggetto Date?

blinkago
21-11-2002, 14:58
Allo stesso modo di prima

if (value instanceof java.util.Date) {
Date data = (Date)value;
}

ghinz
21-11-2002, 15:28
Non riesco a spiegarmi, in effetti rileggendomi non sono stato chiaro, ci riprovo:

metti che da un altro pianeta :eek: ti arrivi un contenitore di oggetti, ad esempio un Vector. Tu non hai idea di cosa c'è dentro, sai solo che il metodo get(index) di Vector ti restituisce un Object.
Questi Object potrebbero essere oggetti String, Integer, Date, Hashtable, etc... ma tu non lo puoi sapere perchè il Vector lo ha riempito un "alieno".
Per semplificare poniamo pure che questo Vector contenga 3 oggetti diversi, un Integer, uno String e un Date.

Adesso mi metto a scandire il mio Vector, la prima chiamata di get(index) mi restituirà un Object che io potrò "castare" ad Integer per ottenere un oggetto "del tipo giusto".
Ora, come si è già detto posso fare:


if (obj instanceof Integer) {
Integer oggetto = (Integer)obj
}
elseif (obj instanceof String) {
String oggetto = (String)obj
}
elseif (obj instanceof Date) {
Date oggetto = (Date)obj
}
Ma quello che volevo sapere io è: visto che obj.getClass() mi dà direttamente il nome della classe esiste un modo per creare subito una variabile "oggetto" del tipo giusto senza dover fare tutti quegli if?

Una cosa del tipo

Object obj = vector.get(0);
Class classe = obj.getClass();
classe oggetto = (classe)obj // questo è sparato a caso

Arigrazie :fagiano:

pippo75
21-11-2002, 17:22
prova a dare un'occhio sul sito della sun al tutorial sulla riflessione (http://java.sun.com/docs/books/tutorial/reflect/index.html)

Dwenegar
21-11-2002, 19:14
Da quel che mi risulta l'unico modo in cui si può operare è con tutti quegli "if".

blinkago
21-11-2002, 19:31
Si...
In effetti con la riflessione si può fare...
Il problema stà nei puntatori!!!
Per utilizzare gli oggetti devi avere un puntatore con il tipo di oggetto che viene letto dal compilatore!!!
Se il puntatore e di tipo Object i metodi che potrai utilizzare sono di tipo Object, se è di tipo Integer potrai utilizzare i metodi di Integer!!!!
Utilizzare la reflection per l'istanziazione corrisponde a non programmare in Java, ma con i metodi della Reflection che è, manco a dirlo Moooolto più complicato!!!!
insomma non so se il gioco vale la candela! Sta a te scegliere: o stendi migliaia di IF o ti uccidi con la reflection

ghinz
22-11-2002, 08:37
Ho cominciato a dare un'occhiata alla reflection, ma in effetti come dite voi forse il gioco non vale la candela!
Che dire... riesco sempre a complicarmi la vita :quipy:

Grazie a tutti per l'aiuto :)

Loading