Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Dubbio cast

  1. #1
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182

    Dubbio cast

    Ragazzi non riesco proprio a capire perchè questo cast esplicito dia errore a run-time,dovrebbe andare bene in quanto promuovo una classe ad una classe figlia.


    codice:
    class Point { 
    	int x, y; 
    }
    
    class ColoredPoint extends Point {
    	int color;
    	public void setColor(int c) { 
    		color = c;
    		
    	}
    }
    
    public class Casting {
    	public static void main(String[] args) {
    		Point p = new Point();
    		Point p2 = new ColoredPoint();
    		ColoredPoint cp = new ColoredPoint();
    		cp = (ColoredPoint)p; 		//Errore a run-time
    
    
     }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Dubbio cast

    Originariamente inviato da felpone
    Ragazzi non riesco proprio a capire perchè questo cast esplicito dia errore a run-time,dovrebbe andare bene in quanto promuovo una classe ad una classe figlia.
    Se un oggetto è stato realmente istanziato come Point .... non puoi per "magia" farlo diventare (o anche solo vedere) come ColoredPoint !
    Detto in altro modo: una volta che hai istanziato un oggetto, il suo tipo non lo cambi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    E aggiungo che il cast funziona solo verso l'alto, ossia verso classi più generiche.
    no pm tecnici.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cigiri18
    E aggiungo che il cast funziona solo verso l'alto, ossia verso classi più generiche.
    No, non è vero.

    codice:
    Object o = "Ciao";
    String s = (String) o;
    Non solo compila correttamente ma a runtime funziona anche correttamente senza lanciare ClassCastException. Questo è un "down" cast (nella documentazione ufficiale è indicato con Narrowing Reference Conversion) ed è controllato a runtime. Ma è corretto, perché l'oggetto referenziato da o è davvero, realmente un String.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    Dovevo spiegarmi meglio, ma da telefono tendo ad esser breve. Intendevo che non si può andar più giù della classe originale.
    no pm tecnici.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cigiri18
    Intendevo che non si può andar più giù della classe originale.
    Se intendi es.:
    codice:
    class A { }
    class B extends A { }
    class C extends B { }
    A a = new B();
    C c = (C) a;


    Il compilatore lo accetta perfettamente ma a runtime fallisce, perché è evidente che l'oggetto istanziato non è un C.

    Un cast a qualunque cosa più "sotto" di B nel codice sopra fallirà sempre a runtime. Questo sì, assolutamente ok, se intendevi dire questo, ed è ovvio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.