Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    88

    cast automatico

    Ragazzi dato che ho una collezione di oggetti di tipo diverso in un vector che li converte a Object ho questo problema:

    è possibile attraverso la reflection sapere l'oggetto di quale classe è fare il cast dell'object a quest'ultima in modo da poter usare i suoi metodi?

    Ho letto un pò di cose, ma non sono ferratissimo. Mi pare di aver capito che si può fare.
    Qualcuno mi può fare o postare un esempio.

    grazie a tutti coloro interverrano!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Premesso che un oggetto non viene mai convertito in un altro oggetto.
    Al più lo si può "vedere" solo attraverso una delle sue forme.

    Se hai un oggetto di una classe X, ma lo vedi solo come Object, puoi effettuare un test usando l'operatore instanceof:

    codice:
    Object obj = tuoVector.elementAt( ... );
    
    if (obj instanceof String) {
       // E' una stringa
       String mioOggetto = (String) obj;
    }
    
    if (obj instanceof Integer) {
       // E' un intero
       Integer mioOggetto = (Integer) obj;
    }
    
    if (obe instanceof JFrame) {
       // E' un JFrame
       JFrame mioOggetto = (JFrame) obj;
    }
    Perchè tu abbia deciso di avere un Vector old-stile (non tipizzato) non lo so, ma generalmente non è una buona pratica.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Per quanto riguarda la reflection è un mondo a parte, ti rimando alla documentazione ufficiale di oracle; Per il tuo problema, ti basta usare l'operatore "instanceof" che permette di controllare il tipo a runtime dell'oggetto:
    codice:
    Vector<Object> vector = new Vector<Object>();
    vector.add(new Casa());
    vector.add(new Persona());
    Object element = vector.get(1);
    if(element instanceof Casa)
    {
      //cast a casa
    }else if(element instanceof Persona)
    {
     //cast a persona
    }
    Ovviamente la seconda soluzione e molto meno elegante e va contro tutti i buon propositi della OOP.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    88
    il problema è che nel vettore non so che tipi di oggetti ci andranno.
    potrebbero tranquillamente andarci 5 oggetti diversi, per questo non posso usare i generics e non posso di certo mettermi a fare 10 if per 10 istanceof diversi

  5. #5
    Mi sà che c'è un problema di progettazione di fondo, non è che forse è meglio fare una refattorizzazione di quegli oggetti in modo magari che discendano da una comune classe o interfaccia.
    Questo perchè anche se con la reflection è possibile evitare di effetturare i cast ma cmq devi sapere la firma dei metodi che devi invocare quindi gli "if" ne useresti molto di più.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Infatti, per questo la mia domanda sul perchè un Vector old-style.
    Se non sai che tipo di oggetti andranno a finire nel Vector, quasi certamente la cosa è progettata male e può essere migliorata.

    In questo caso è più comune fare in modo che tutti gli oggetti che finiscono nel Vector discendano da una classe (magari astratta) comune o implementino una certa interfaccia (che offre tutte le operazioni necessarie al trattamento dell'oggetto) e creare un Vector tipizzato per quella classe/interfaccia.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    88
    no no non mi serve applicare i metodi sull'oggetto,
    a seconda del tipo di oggetto che ho devo passarlo devo fare altre operazioni e leggere il contenuto dell'oggetto, sia esso un Integer, un Pluto, ecc ecc

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 © 2025 vBulletin Solutions, Inc. All rights reserved.