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

Discussione: Dubbio sul downcasting

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    68

    Dubbio sul downcasting

    class A {
    ...
    }

    class B extends A {
    ...
    }


    Il mio prof ha detto:
    A b = new B(); //si puo fare
    B b = new A(); // non si puo fare


    Quello che non si puo fare non equivarrebbe a fare un downcasting?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Dubbio sul downcasting

    Originariamente inviato da 8paolo9
    Quello che non si puo fare non equivarrebbe a fare un downcasting?
    No, il downcasting è un'altra cosa:
    codice:
    A a = new B();
    B b = (B)a;
    (questo codice compila)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    68
    grazie per la risposta!!

    invece se avessi:

    class A {
    public void stampa() {
    System.out.println("classe A");
    }
    }

    class B extends A {
    public void stampa () {
    System.out.println("classe B");
    }
    }

    //Main
    A oggettoA = new A();
    B oggettoB = new B();

    //Vorrei far stampare "classe A" richiamando il metodo stampa su oggettoB con la parolina super ma non funziona. Io faccio così:

    oggettoB.super.stampa();

    //Perchè non funziona?

  4. #4
    Non puoi richiamare super su un'istanza, comunque se vuoi invocare il metodo stampa() contenuto nella classe A sull'istanza della classe B allora non devi effettuarne l'override. Se togli il metodo stampa() dalla classe B allora verrà automaticamente invocato quello presente nella classe A, se invece ne effettui l'override verrà invocato sempre e solo quello della classe B.
    All'interno della classe B puoi eventualmente invocare il metodo padre utilizzando il super.

    codice:
    class B extends A {
        public void stampa () {
            super.stampa();
            System.out.println("classe B");
        }
    }
    In questo modo invocando il metodo stampa() sull'istanza della classe B verrà invocato anche il metodo stampa() della superclasse.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    68
    capito grazie!!

    ho ancora un altro dubbio (scusate le 8000 domande ma ho un esame fra meno di 1 mese e sono in panico totale!!)


    class Animale {
    string animale;

    public void stampa () {
    System.out.println("animale");
    }
    }



    class Cane extends Animale {
    string cane;

    public void stampa () {
    System.out.println("cane");
    }
    }



    //Domande:


    1- Animale animal = new Cane() equivale a creare un oggetto animal di tipo Animale e poi fare un dowcast?


    2- Fare animal = dog; e fare animal = (Cane) dog; equivale a fare la stessa cosa?


    3- dopo aver fatto
    Animale animal = new Animale();
    Cane dog = new Cane();
    animal = dog; //ho trasformato animal in un oggetto di tipo Cane, come posso ritrasformare animal in un oggetto di tipo Animale?



    Grazie ancora!!

  6. #6
    Considera questo esempio:

    codice:
    Animale animal = new Cane();
    animal.stampa();
    
    Cane cane = (Cane) animal; // Questo cast è consentito
    cane.stampa();
    		
    Animale anim = new Animale();
    Cane can = (Cane) anim; // Questo cast causa un'eccezione a runtime
    can.stampa();
    Per quantop riguarda questo:

    Animale animal = new Animale();
    Cane dog = new Cane();
    animal = dog;

    non hai trasformato animal in un oggetto di tipo Cane come affermi. In realtà (java lavora per riferimenti e non per valore) hai assegnato ad animal lo stesso riferimento di dog per cui entrambe le variabili puntano allo stesso riferimento.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    68
    ok, allora quando Java ci lascia fare i downcast? Ogni volta che provo a fare un downcast, java mi lascia compilare però quando eseguo mi lancia un'eccezione del tipo cannot be cast..

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Originariamente inviato da 8paolo9
    ok, allora quando Java ci lascia fare i downcast? Ogni volta che provo a fare un downcast, java mi lascia compilare però quando eseguo mi lancia un'eccezione del tipo cannot be cast..
    Ogni volta che è possibile.
    E' ovvio che se tenti di effettuare un downcast fra oggetti che non possono essere downcastati otterrai una ClassCastException.

    Il downcast è possibile solo quando l'oggetto di tipo A rappresenta effettivamente un oggetto di tipo B. Esempio:

    codice:
    // Questo metodo opera su oggetti di tipo Number
    public void metodo(Number n) {
       ...  // Effettua delle operazioni su oggetti Number
    
       // Ma se l'oggetto Number è specificatamente un Integer,
       // allora posso anche effettuare queste altre operazioni, che sono
       // specifiche per gli Integer
    
       if (n instanceof Integer) {
    
          Integer i = (Integer) n;   // downcast che va a buon fine sempre!
          ...   // operazioni specifiche per gli interi
    
       }
    }
    Quel metodo io lo posso invocare in tanti modi:

    codice:
       metodo( new Double(9.2) );
       metodo( new Float(4f) );
       metodo( new Integer(7) );
    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

  9. #9
    In fase di compilazione Java non ti darà mai errore in caso di upcasting e downcasting. Il problema verrà riscontrato in fase di runtime.
    In pratica è sempre possibile effettuare il downcasting, ma essa andrà a buon fine (senza generare un ClassCastException) solo se l'istanza è comunque del sottotipo.
    Come da esempio precedente:

    codice:
    Animale animal = new Cane();
    Cane cane = (Cane) animal; // Corretto
    		
    Animale anim = new Animale();
    Cane can = (Cane) anim; // Causa un'eccezione di tipo ClassCastException a runtime
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    68
    cane è sottotipo di animale......... o sbaglio?
    Quando ho creato le due classi ho scritto che Cane implements Animale, con questo non si intende che è anche un sottotipo?

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.