class MezzoTipizzato {
    public String descrizione() {
        return "mezzo";
    }
}

class AutoTipizzata extends MezzoTipizzato {
    @Override
    public String descrizione() {
        return "auto";
    }

    public int porte() {
        return 4;
    }
}

class BiciTipizzata extends MezzoTipizzato {
    @Override
    public String descrizione() {
        return "bici";
    }
}

public class DemoTipi {
    public static void main(String[] args) {
        MezzoTipizzato mezzo = new AutoTipizzata();
        System.out.println(mezzo.descrizione());
        if (mezzo instanceof AutoTipizzata auto) {
            System.out.println("porte: " + auto.porte());
        }

        mezzo = new BiciTipizzata();
        System.out.println(mezzo.descrizione());
        System.out.println(mezzo instanceof AutoTipizzata);

        MezzoTipizzato assente = null;
        System.out.println(assente instanceof AutoTipizzata);
        try {
            AutoTipizzata sbagliata = (AutoTipizzata) mezzo;
            System.out.println(sbagliata.porte());
        } catch (ClassCastException errore) {
            System.out.println("cast non valido");
        }
    }
}
