Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182

    [java] Delucidazione su alcuni cast

    Posto il codice....

    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
    		//cp = (ColoredPoint)p2;		//OK
    		//Long l = (Long)p; 		//Errore in compilazione
    		//int i = (int) p; 			//Errore in compilazione
    		
    		//cp.setColor(1);
    		//p2.setColor(2);
    		//((ColoredPoint)p2).setColor(2);
    		//((ColoredPoint) p).setColor(4);
    	}
    }
    Non capisco perchè vi sia un errore run-time quì:
    cp = (ColoredPoint)p;,
    stiamo effettuando un semplice cast narrowing,perchè?

    Poi un altro errore run-time è
    p2.setColor(2);
    e dice che il metodo set color non appartiene a p2,ma allora a che serve fare così:
    Point p2 = new ColoredPoint();
    perchè si dichiara un oggetto di una classe invocando la new su una sottoclasse?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Java ha una sezione dedicata.

    Sposto.


    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

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Premessa: il cast non trasforma un bel niente. Il cast serve solo per specificare meglio le proprietà di un oggetto che, all'inizio, non sono note (ma ci sono!).

    cp = (ColoredPoint)p;

    E' sbagliata perchè "p" non è un oggetto ColoredPoint, ma Point. Ciò che conta è quello che viene "istanziato" con la new. Ed è stato istanziato un Point, non un ColoredPoint. E' un po' come istanziare un Animale e volerlo castare a Uomo... e chi ci dice che quell'animale sia davvero un uomo e non un coniglio?


    Per il secondo errore, vedi questa discussione di qualche giorno fa. Creare un oggetto in quel modo non serve a nulla... dovrebbe servire a "spiegare" l'ereditarietà, ma secondo me si spiega meglio come ho fatto io in quel post.


    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

  4. #4
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    Mi stai dicendo che il cast non effettua nessuna conversione???

  5. #5
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    In questo caso il cast converte il double in int:
    codice:
    double balance=13.75;
    int dollars=(int)balance;
    come me la spieghi sa cosa??

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Lì stiamo parlando di variabili di tipo primitivo.
    Semplicemente viene creata una nuova variabile e le viene assegnato la parte intera del valore double. Non confondere il cast tra tipi primitivi con il cast fra oggetti.
    Il cast fra oggetti non fa nessuna conversione (e ci mancherebbe altro!)

    PS: anche nei tipi primitivi non c'è nessuna trasformazione... la variabile "balance" non è stata minimanente toccata... semplicemente è stato adeguato il suo contenuto alla variabile intera di destinazione.


    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

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.