0Pricing
Java Academy · Lezione

Upcasting/downcasting e instanceof

Comprendere l’upcasting verso un tipo genitore, il downcasting sicuro con instanceof e gli errori comuni che causano ClassCastException.

Upcasting/downcasting e instanceof è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 3 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 3 lezioni in totale.

Upcasting e downcasting

Upcasting consiste nel memorizzare un oggetto figlio in un riferimento di tipo padre ed è sempre sicuro. Il downcasting procede nella direzione opposta e richiede attenzione. Si usa instanceof per verificare il tipo reale a runtime.

Codice: esempio di upcasting

L'upcasting è implicito e sicuro: è possibile trattare un Dog come un Animal. Si possono chiamare i metodi dichiarati in Animal; a runtime viene eseguita la versione di Dog.

public class Main {
  static class Animal {
    void speak() { System.out.println("Animal sound"); }
  }
  static class Dog extends Animal {
    void speak() { System.out.println("Woof"); }
    void fetch() { System.out.println("Fetch!"); }
  }

  public static void main(String[] args) {
    // Upcasting: Dog stored in an Animal reference (safe, automatic)
    Animal a = new Dog();
    a.speak();  // calls Dog's speak() due to dynamic binding

    // a.fetch(); // Not allowed: reference is Animal, which does not declare fetch
    System.out.println("Upcasting hides Dog-only methods from the reference type.");
  }
}

Perché usare il downcasting?

Si usa il downcasting quando serve un metodo specifico del figlio, come fetch(). Dovrebbe essere raro e sottoposto a controlli accurati. Quando possibile, è preferibile scrivere il codice usando il tipo padre o un'interfaccia.

Codice: downcasting sicuro

Usate instanceof prima del cast. Se il controllo fallisce, evitate il cast e scegliete un percorso alternativo; in questo modo si evita una ClassCastException.

public class Main {
  static class Animal { void speak() { System.out.println("Animal sound"); } }
  static class Dog extends Animal { void speak() { System.out.println("Woof"); } void fetch() { System.out.println("Fetch!"); } }
  static class Cat extends Animal { void speak() { System.out.println("Meow"); } }

  public static void main(String[] args) {
    Animal a1 = new Dog();
    Animal a2 = new Cat();

    // Safe downcast using instanceof
    if (a1 instanceof Dog) {
      Dog d = (Dog) a1;
      d.fetch(); // OK
    }

    if (a2 instanceof Dog) {
      Dog d2 = (Dog) a2; // will not run
      d2.fetch();
    } else {
      System.out.println("a2 is not a Dog, skip casting.");
    }
  }
}

Insidie comuni

Un'insidia è eseguire il cast senza controllare il tipo: può verificarsi una ClassCastException. Un'altra è abusare del downcasting invece di progettare il codice in base alle interfacce. Tenete i cast vicino al punto in cui servono e preferite il polimorfismo.

Codice: cast errato e cast sicuro

Non eseguite mai un cast alla cieca. Se non siete certi del tipo a runtime, proteggete il cast con instanceof e scegliete un'alternativa sicura se il tipo non corrisponde.

public class Main {
  static class Animal { void speak() { System.out.println("Animal"); } }
  static class Dog extends Animal { void fetch() { System.out.println("Fetch!"); } }
  static class Cat extends Animal { }

  public static void main(String[] args) {
    Animal a = new Cat();

    // Bad: direct cast (would throw at runtime)
    // Dog dBad = (Dog) a; // ClassCastException if uncommented

    // Good: check first
    if (a instanceof Dog) {
      Dog d = (Dog) a;
      d.fetch();
    } else {
      System.out.println("Not a Dog; skipping cast.");
    }
  }
}

Verifica sul downcasting

Verifica rapida: come si esegue in sicurezza il downcasting di un riferimento Animal a Dog?

Riepilogo

Riepilogo: l'upcasting è sicuro e comune. Il downcasting richiede instanceof per evitare arresti anomali; per ridurre i cast, è preferibile progettare il codice usando i tipi padre o le interfacce.

Domande Frequenti

La lezione «Upcasting/downcasting e instanceof» è gratuita?

Sì — il testo completo di «Upcasting/downcasting e instanceof» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 3 lezioni in totale.

Cosa imparerò in «Upcasting/downcasting e instanceof»?

Comprendere l’upcasting verso un tipo genitore, il downcasting sicuro con instanceof e gli errori comuni che causano ClassCastException. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 3.

Quanto tempo richiede la lezione «Upcasting/downcasting e instanceof»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Classi astratte
  2. Interfacce (introduzione e confronti)
  3. Upcasting/downcasting e instanceof
← Torna a Java Academy