Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    ClassCastException strana (?)

    Ho questo metodo:

    Codice PHP:
        public String[] getCategories() {
            return (
    String[]) data.keySet().toArray();
        } 
    Per compilare compila ma quando il metodo viene eseguito da questo errore:


    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object;
    ...
    ...
    ...


    Perchè? Cos'ho sbagliato nel cast?

    ah, "data" è questa roba qui:
    TreeMap<String, TreeMap<String, Snippet>> data;


    Grazie
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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

    Re: ClassCastException strana (?)

    Originariamente inviato da Alex'87
    Codice PHP:
        public String[] getCategories() {
            return (
    String[]) data.keySet().toArray();
        } 
    Per compilare compila ma quando il metodo viene eseguito da questo errore:


    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object;
    Per un motivo molto semplice: hai usato il toArray che ritorna un Object[]. Non solo il reference è Object[] ma l'array creato a runtime è proprio un Object[], non un String[].

    Per via della solita questione della "erasure", quel toArray non ha alcun modo di sapere di che tipo è la collezione su cui è invocato!!! Ed essendo realmente l'oggetto un Object[], non può certo essere convertito in un String[].
    In questo caso si dice che il tipo reificato nell'array è Object. Se vuoi che nell'array creato sia reificato il tipo String allora devi usare l'altro toArray:

    return data.keySet().toArray(new String[0]);

    È l'unico modo per poter far sapere a toArray quale tipo di array deve creare. Infatti toArray tramite "reflection" va a vedere di che tipo è l'array passato e poi ne crea una nuova istanza (se lo spazio non è sufficiente, è chiaro).

    E nota che il cast non è più necessario ... in quanto quest'altro toArray è "generico".
    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 L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Re: ClassCastException strana (?)

    Originariamente inviato da andbin
    Per un motivo molto semplice: hai usato il toArray che ritorna un Object[]. Non solo il reference è Object[] ma l'array creato a runtime è proprio un Object[], non un String[].

    Per via della solita questione della "erasure", quel toArray non ha alcun modo di sapere di che tipo è la collezione su cui è invocato!!! Ed essendo realmente l'oggetto un Object[], non può certo essere convertito in un String[].
    In questo caso si dice che il tipo reificato nell'array è Object. Se vuoi che nell'array creato sia reificato il tipo String allora devi usare l'altro toArray:

    return data.keySet().toArray(new String[0]);

    È l'unico modo per poter far sapere a toArray quale tipo di array deve creare. Infatti toArray tramite "reflection" va a vedere di che tipo è l'array passato e poi ne crea una nuova istanza (se lo spazio non è sufficiente, è chiaro).

    E nota che il cast non è più necessario ... in quanto quest'altro toArray è "generico".
    Grazie, non ci avevo proprio pensato ^^'
    Ora funziona tutto alla grande :-)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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 © 2026 vBulletin Solutions, Inc. All rights reserved.