Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211

    [JAVA] Una questione di casting...

    Ho una lacuna sul concetto di casting...
    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
    ghinz

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    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.
    Ciao,
    Lorenzo

  3. #3
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    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?
    ghinz

  4. #4
    Allo stesso modo di prima

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

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  5. #5
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    Non riesco a spiegarmi, in effetti rileggendomi non sono stato chiaro, ci riprovo:

    metti che da un altro pianeta 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:

    codice:
    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
    ghinz

  6. #6
    prova a dare un'occhio sul sito della sun al tutorial sulla riflessione
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  7. #7
    Da quel che mi risulta l'unico modo in cui si può operare è con tutti quegli "if".

  8. #8
    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
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  9. #9
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    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
    ghinz

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.