Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Problema Cast

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218

    Problema Cast

    Ho questa situazione:

    Classe A

    Classi B e C che estendono A.

    Ho un Vector<A> dove gli oggetti contenuti sono però B o C.

    Ora, devo controllare per ogni oggetto in Vector<A> se l'oggetto è B o C.

    Ho provato a fare:

    codice:
     
    for(A a : Vector<A>){
    if(a instanceof B){//fai qualcosa}
    if(a instanceof C){//fai qualcosa}
    }
    Però la condizione degli if fallisce sempre.

    Come posso fare?

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    26
    come inserisci gli oggetti di tipo B o C nel Vector<A>?

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Non devo saperlo, visto che quella parte non è implementata da me...
    Devo riuscire a farlo senza sapere nulla.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    beh...
    potresti fare così e te ne freghi se si tratta di B o di C. Se quel fai qualcosa può rientrare in un metodo, allora in A metti un metodo astratto che fai estendere (e quindi, implementare) sia a B che a C. E così te ne esci facendo

    codice:
    //diciamo che questo mi sa di pseudocodice!
    for (A a : Vector<A>)
    {
      a.quelMetodo();
    }
    boh...
    non so di cosa si tratta il "fai qualcosa", però la soluzione migliore, sia dal punto di vista informatico che di best-practice, è questa...
    fammi sapere

    edit:
    se il test fallisce, sei sicuro che sono inseriti oggetti di tipo B e C in Vector?
    allora prova a fare qualcosa del genere. Non l'ho mai provato, ma teoricamente dovrebbe funzionare:

    for (A a : Vector<A>)
    {
    if (a.class.equals(B.class)){//fai qualcosa}
    if (a.class.equals(C.class)){//fai qualcosa}
    }
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Originariamente inviato da Hysoka
    beh...
    potresti fare così e te ne freghi se si tratta di B o di C. Se quel fai qualcosa può rientrare in un metodo, allora in A metti un metodo astratto che fai estendere (e quindi, implementare) sia a B che a C. E così te ne esci facendo

    codice:
    //diciamo che questo mi sa di pseudocodice!
    for (A a : Vector<A>)
    {
      a.quelMetodo();
    }
    boh...
    non so di cosa si tratta il "fai qualcosa", però la soluzione migliore, sia dal punto di vista informatico che di best-practice, è questa...
    fammi sapere

    edit:
    se il test fallisce, sei sicuro che sono inseriti oggetti di tipo B e C in Vector?
    allora prova a fare qualcosa del genere. Non l'ho mai provato, ma teoricamente dovrebbe funzionare:

    for (A a : Vector<A>)
    {
    if (a.class.equals(B.class)){//fai qualcosa}
    if (a.class.equals(C.class)){//fai qualcosa}
    }
    Purtroppo non funziona, perchè i metodi da usare su 'a' sono in B e C, altrimenti il problema non si porrebbe.

    E penso che neanche il test funzioni visto che a.class ritorna A e B.class ritorna B...

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    Originariamente inviato da TheBestNeo
    E penso che neanche il test funzioni visto che a.class ritorna A e B.class ritorna B...
    e allora, perdonami, ti sei risposto tu stesso:
    a instanceof B FALLISCE per quello che hai detto tu!
    A questo punto vector non contiene oggetti di tipo B e C...
    cmq, non vorrei dire una ca....a, però con Java Generics, in questo caso Vector<A>, non puoi mettere oggetti derivati da A, ovvero, non puoi mettere oggetti B e C, anche se sono sottoclassi di A
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Originariamente inviato da Hysoka
    e allora, perdonami, ti sei risposto tu stesso:
    a instanceof B FALLISCE per quello che hai detto tu!
    A questo punto vector non contiene oggetti di tipo B e C...
    cmq, non vorrei dire una ca....a, però con Java Generics, in questo caso Vector<A>, non puoi mettere oggetti derivati da A, ovvero, non puoi mettere oggetti B e C, anche se sono sottoclassi di A
    Non ho capito cosa vuoi dire...

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    :quote:

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    che Vector<A> contiene istanze di oggetti solamente di tipo A.
    Comunque, i Generics in Java non supportano il fatto che tu possa mettere istanze di sottoclassi di un tipo generics assegnato. Non so se è chiaro a parole, ma un esempio spiegherà tutto

    codice:
    Vector<A> mioVettore = new Vector<A>();
    mioVettore.add(new A()); //ok
    mioVettore.add(new A()); //ok
    mioVettore.add(new B()); //illegale!
    mioVettore.add(new C()); //illegale!
    anche se B e C sono sottoclassi di A.
    Qualche giorno fa c'era una discussione a cui ho partecipato ed un utente (scusami, ma nn ricordo il tuo nick) mi ha spiegato bene (sono io che ho capito male) questo fatto.
    Quindi il tuo test (instanceof) fallisce perché vector ha solo elementi di tipo A.
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Il vettore non contiene istanze, ma dati recuperati da un DB...

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.