Effettuare cast con il getclass

di il
11 risposte

Effettuare cast con il getclass

Ragazzi ho una super classe e altre 4 classi che ereditano, ho un arraylist della classe principale e mi serve una volta che estrapolo la classe dall'arraylist di sapere a cosa castare l'elemento estrapolato idee?

11 Risposte

  • Re: Effettuare cast con il getclass

    broke31 ha scritto:


    Ragazzi ho una super classe e altre 4 classi che ereditano, ho un arraylist della classe principale e mi serve una volta che estrapolo la classe dall'arraylist di sapere a cosa castare l'elemento estrapolato idee?
    Hai un ArrayList<Base> (Base è la tua classe principale) che contiene oggetti di tipo A B C D (le 4 sottoclassi)? E vuoi sapere se un oggetto all'indice i-esimo è un A, un B, ecc... ?
    Di per sé basta instanceof, se invece vuoi un test "stretto" allora es. x.getClass() == A.class .

    Ma domanda: perché devi farlo? Hai metodi "nuovi" delle sottoclassi che vuoi invocare? Quindi non hai metodi invocabili polimorficamente dal tipo base?
  • Re: Effettuare cast con il getclass

    In pratica ho una super classe A e 4 sotto classi B C D E , B e C hanno una data all'interno le altre due no il problema sorge che devo scrivere un algoritmo per ordinare l'arraylist in base alla data considerando che le classi D e E non hanno
    data di scadenza quindi metterle alla fine del arraylist
  • Re: Effettuare cast con il getclass

    broke31 ha scritto:


    In pratica ho una super classe A e 4 sotto classi B C D E , B e C hanno una data all'interno le altre due no il problema sorge che devo scrivere un algoritmo per ordinare l'arraylist in base alla data considerando che le classi D e E non hanno
    data di scadenza quindi metterle alla fine del arraylist
    Non so ovviamente cosa siano di preciso A, B, .... E ma visto che parli di "data di scadenza" mi viene da pensare che siano dei "prodotti", dove appunto alcuni devono avere una data di scadenza e altri ... ovviamente non ce l'hanno.

    Una prima soluzione è quella di sfruttare il polimorfismo con una interfaccia. Definisci una interfaccia es. Deperibile che dichiara il metodo che fornisce la data di scadenza. Alcune classi la implementano, altre no.
    Nella logica di comparazione (es. in un Comparator) ti basta verificare se l'oggetto è-un Deperibile con instanceof.
    Le interfacce servono appunto a fornire una "astrazione" e in questo modo la tua logica di comparazione non deve "sapere" dei nomi di quelle classi (se non ci sono altre ragioni per cui invece dovrebbe, chiaramente). Se un giorno ti sbuca fuori una nuova classe F che ha la data di scadenza, per la tua logica non cambia proprio nulla (sempre se non ha altre ragioni per cambiare).

    Altra idea: sei sicuro che non si possa mettere la nozione della data di scadenza nella classe base? Un null potrebbe indicare "nessuna scadenza". Di per sé non mi sembra proprio "sbagliato".
  • Re: Effettuare cast con il getclass

    Ma io credevo che istanceOf mi potesse dire semplicemente il nome della classe mentre puó dire anche se implementa 1 interfaccia ? Ho ben capito ? P.s. hai indovinato in pieno anche il nome della classe prodotto...sei un genio 6
  • Re: Effettuare cast con il getclass

    broke31 ha scritto:


    Ma io credevo che istanceOf mi potesse dire semplicemente il nome della classe mentre puó dire anche se implementa 1 interfaccia ? Ho ben capito ?
    x instanceof Y
    dice solo e semplicemente se l'oggetto referenziato da x "è-un" tipo (o sottotipo di) Y.

    Vale per qualunque tipo, a patto che l'espressione sia ritenuta valida/accettata dal compilatore. Un reference di tipo String non ha nulla a che fare (non è in alcuna relazione) con es. Number, quindi:

    String unStr;
    ...
    unStr instanceof Number

    viene subito rifiutato dal compilatore, perché "sa" a priori che unStr non potrà mai referenziare un Number.
  • Re: Effettuare cast con il getclass

    Quindi con un istanceOf posso capire ad esempio se implementa clonable per farti un esempio giusto?
  • Re: Effettuare cast con il getclass

    broke31 ha scritto:


    Quindi con un istanceOf posso capire ad esempio se implementa clonable per farti un esempio giusto?
  • Re: Effettuare cast con il getclass

    Ho comunque un problema perché ho diciamo la classe amministratore che deve riuscire ad ordinare l'arrayList di tutti i prodotti, nel mio caso i prodotti sono abstract visto che prodotto è una superasse e che non andrò mai ad istanziare un prodotto ma sempre una sotto classe, ho fatto come hai detto tu in vacanza e in ceneRistoranti ho fatto implementare l'interfaccia, nelle altre due classi no adesso in amministratore mi domando se l'elemento che ho è un istanceof di Deperibile, ma sono fermo qui perché non so come continuare visto che non riesco ad accedere al metodo dataScadenza presente in tutte e due le classi che implementano l'interfaccia visto che dovrei comunque effettuare un cast
  • Re: Effettuare cast con il getclass

    broke31 ha scritto:


    mi domando se l'elemento che ho è un istanceof di Deperibile, ma sono fermo qui perché non so come continuare visto che non riesco ad accedere al metodo dataScadenza presente in tutte e due le classi che implementano l'interfaccia visto che dovrei comunque effettuare un cast
    Se il test con instanceof ti dice che il prodotto è-un Deperibile, fai un cast del prodotto a Deperibile e quindi invochi il metodo. La strada è questa.
  • Re: Effettuare cast con il getclass

    É possibile castare ad un'interfaccia? il mio prof in tutto questo non ha mai detto niente a riguardo. ..
  • Re: Effettuare cast con il getclass

    broke31 ha scritto:


    É possibile castare ad un'interfaccia?
    Certo! Il cast ad una interfaccia è controllato a runtime, come per qualunque altro "down" cast sui reference. A meno ovviamente che il compilatore possa già provare a priori che il cast è "safe" (es. un reference String e un suo cast a CharSequence .... String è un CharSequence, il compilatore lo "scopre" subito e non mette alcun controllo a runtime).

    broke31 ha scritto:


    il mio prof in tutto questo non ha mai detto niente a riguardo. ..
    Immagino non esista l'opzione "cambia prof" ...
Devi accedere o registrarti per scrivere nel forum
11 risposte