Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [teoria]Cast in java

    In C ci sono due modi per convertire un tipo: il cast esplicito e implicito.
    E mi è sempre evidente se il cast è esplicito o no, ad esempio, se ho:
    codice:
    int i;
    float f;
    f=f+i; // cast implicito
    i=(int)f; // cast esplicito
    Ma in java ci sono altri modi per convertire: ad esempio utilizzando il metodo toString().
    Visto che la differenza sostanziale tra cast esplicito e implicito è che nel cast esplicito si specifica a livello di codice che si sta effettuando una conversione, se io ho una classe A che contiene il metodo toString(), e dichiaro:
    codice:
    A a=new A();
    System.out.println(a);
    Sto effettuando un cast implicito o esplicito? A livello di codice non sto specificando niente,eppure questa dichiarazione è equivalente a:
    codice:
    System.out.println(a.toString());
    //Oppure:
    System.out.println((String)a);
    E non sono sicuro se dichiarando System.out.println(a) il cast avviene a runtime o a compile time.
    Cosa dite ?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    in principio era java.lang.Object
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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

    Re: [teoria]Cast in java

    Originariamente inviato da ramy89
    In C ci sono due modi per convertire un tipo: il cast esplicito e implicito.
    Anche in Java esiste questa distinzione sui cast.

    Originariamente inviato da ramy89
    Ma in java ci sono altri modi per convertire: ad esempio utilizzando il metodo toString().
    Ma questo .... non è un "cast"!! Semplicemente è una funzionalità offerta dal framework. Ogni oggetto ha un toString() che fornisce una descrizione dell'oggetto (più certi toString static delle classi wrapper).

    Originariamente inviato da ramy89
    codice:
    A a=new A();
    System.out.println(a);
    Sto effettuando un cast implicito o esplicito?
    Nessuno dei due. Quel println è in effetti quello che riceve un Object. Questo println "sa" solo di dover invocare toString() espressamente sull'oggetto per stamparne la stringa risultante. (anzi, per essere pignoli, questo println invoca solamente String.valueOf(Object) ed è poi questo valueOf che, se l'oggetto non è null, invoca toString() ).

    Originariamente inviato da ramy89
    questa dichiarazione è equivalente a:
    codice:
    System.out.println(a.toString());
    L'unica cosa di esplicito è che al println non passi un oggetto A ma direttamente un oggetto String. Nemmeno questo è un "cast".

    Originariamente inviato da ramy89
    codice:
    System.out.println((String)a);
    Questo proprio no. Il 'a' è di classe A .... è di certo non è-un String.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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

    Re: Re: [teoria]Cast in java

    Originariamente inviato da andbin
    System.out.println(a);
    Sto effettuando un cast implicito o esplicito?

    Nessuno dei due.
    Rileggendolo .... mi scuso con ramy89. Dovevo essere meno affrettato e più preciso. Qui c'è in effetti un "up" cast che è implicito ma semplicemente perché A è-un Object e quindi può essere passato al println(Object)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Anche se nella classe A c'è overriding del metodo toString() ?
    Quindi l' argomento sarebbe un oggetto di tipo A e Object.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ramy89
    Anche se nella classe A c'è overriding del metodo toString() ?
    Non centrerebbe. Un override di toString() permetterebbe solo di specializzare il testo da restituire.
    Che A è-un Object è un fatto che non cambia ed è solo questo che permette di passare es. una variabile a di tipo A al println(Object)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Quindi ricapitolando questi sono:
    codice:
    System.out.println(a); // cast implicito, eseguito a runtime dalla jvm
    System.out.println(a.toString());  // cast esplicito
    Giusto ?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ramy89
    codice:
    System.out.println(a); // cast implicito, eseguito a runtime dalla jvm
    Non proprio. Se a è di qualunque tipo reference eccetto String, allora viene invocato il println(Object). Se la variabile a non è di tipo Object, allora è un sottotipo di Object. Quindi è un up-cast implicito. Un up-cast viene anche chiamato nella documentazione tecnica un "widening" (ampliamento).

    Nel Java Language Specification in 5.1.5 Widening Reference Conversions
    si legge:

    Widening reference conversions never require a special action at run time and therefore never throw an exception at run time.

    Un widening quindi non richiede nulla a runtime. Il compilatore ha già la "prova" che quello è un sottotipo e quindi non solo è corretto il passaggio ma è anche "innocuo".

    Originariamente inviato da ramy89
    codice:
    System.out.println(a.toString());  // cast esplicito
    Qui invece non c'è alcun cast. a.toString() è semplicemente la invocazione di un metodo che restituisce un String (poteva essere a.getDescrizione() e non sarebbe cambiato nulla). E in tal caso viene scelta (dal compilatore) la invocazione di println(String). Quindi un String assegnato dove è richiesto un String. Nessun cast, nemmeno "up" cast.
    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.