Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93

    [Java] cast in oggetti di un array

    salve,
    per un progetto universitario (biblioteca) ho creato una classe Articolo estesa da rivista e libro.
    nella classe biblioteca creo un array di tipo articolo che al suo interno contiene sia tipi libro che rivista...
    quando vado a stampare come devo fare a castare i tipi per accedere ai campi di libro ad esempio?

    faccio un esempio...dopo aver creato un oggetto "a" biblioteca vado a fare

    a.listaarticoli[i].editorelibro //qui ovviamente da errore perchè editorelibro è un campo di libro e inaccessibile essendo Articolo il tipo statico di listaarticoli

    per accedervi dovrei fare un cast...ho abbozzato ad una roba del genere ma sicuramente è sbagliata infatti eclipse mi da errore...

    a.((libro)listaarticoli[i]).editorelibro

    qual'è il giusto procedimento?
    grazie mille!

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

    Re: [Java] cast in oggetti di un array

    Originariamente inviato da ratal
    salve,
    per un progetto universitario (biblioteca) ho creato una classe Articolo estesa da rivista e libro.
    nella classe biblioteca creo un array di tipo articolo che al suo interno contiene sia tipi libro che rivista...
    quando vado a stampare come devo fare a castare i tipi per accedere ai campi di libro ad esempio?

    faccio un esempio...dopo aver creato un oggetto "a" biblioteca vado a fare

    a.listaarticoli[i].editorelibro //qui ovviamente da errore perchè editorelibro è un campo di libro e inaccessibile essendo Articolo il tipo statico di listaarticoli

    per accedervi dovrei fare un cast...ho abbozzato ad una roba del genere ma sicuramente è sbagliata infatti eclipse mi da errore...

    a.((libro)listaarticoli[i]).editorelibro

    qual'è il giusto procedimento?
    grazie mille!
    Il procedimento è già corretto, solo che va preceduto da un confronto: devi essere sicuro, infatti, che l'oggetto che hai per le mani sia di tipo "Libro" e non di tipo "Rivista".

    A parte il fatto che potresti utilizzare meglio il polimorfismo (creando, ad esempio, dei metodi appositi), esiste l'operatore instanceof che ti permette di conoscere il tipo di un oggetto:
    codice:
    if(listaarticoli[i] instanceof Libro) {
       // Qui puoi fare il cast a Libro
    }
    Puoi anche agire in questo modo, che però è più restrittivo:
    codice:
    if (listaarticoli[i].getClass() == Libro.class) {
       // Qui puoi fare il cast a Libro
    }
    Ciao.

    PS: penso che il codice che hai scritto sia solo esemplificativo e che tu non abbia utilizzato per davvero la prima lettera minuscola per i nomi delle classi... le convenzioni aiutano te e chi ti aiuta
    "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
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] cast in oggetti di un array

    Originariamente inviato da ratal
    faccio un esempio...dopo aver creato un oggetto "a" biblioteca vado a fare

    a.listaarticoli[i].editorelibro //qui ovviamente da errore perchè editorelibro è un campo di libro e inaccessibile essendo Articolo il tipo statico di listaarticoli
    E il concetto di "incapsulamento" dove lo mettiamo??? Non dirmi che listaarticoli è un campo pubblico di Biblioteca ....

    Originariamente inviato da ratal
    per accedervi dovrei fare un cast...ho abbozzato ad una roba del genere ma sicuramente è sbagliata infatti eclipse mi da errore...

    a.((libro)listaarticoli[i]).editorelibro

    qual'è il giusto procedimento?
    Non puoi fare un cast così ... di brutto. E se l'oggetto nell'array non è un Libro?? Otterresti una bella ClassCastException!

    Tralasciando un momento l'accesso dall'esterno di listaarticoli, dovresti fare:

    codice:
    if (listaarticoli[i] instanceof Libro)
    {
        Libro l = (Libro) listaarticoli[i];
        // .... usa 'l' ....
    }
    else if (listaarticoli[i] instanceof Rivista)
    {
        Rivista r = (Rivista) listaarticoli[i];
        // .... usa 'r' ....
    }
    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
    Registrato dal
    Apr 2008
    Messaggi
    93
    scusate ragazzi nn l'avevo scritto ma il pezzo con instanceof l'avevo già messo...facciamo che vi copio il pezzo di codice pari pari...

    for(int i=0; i<a.indice.length; i++)
    {
    if (a.indice[i] instanceof Libro) System.out.println("Libro "+a.indice[i].inventario+" titolo "+a.((Pubblicazioni)indice[i]).getTitolo()+" di "+a.((Libro)indice[i]).autore+" edizione "+a.((Libro)indice[i]).edizione);
    else if(a.indice[i] instanceof Rivista) System.out.println("Rivista "+a.indice[i].inventario+" titolo "+a.((Pubblicazioni)indice[i]).getTitolo()+" periodicità "+a.((Rivista)indice[i]).getPeriodicita()+" data "+a.((Rivista)indice[i]).getData()+" numero "+a.((Rivista)indice[i]).getNumero());
    }

    ovviamente dove non ho messo il get i campi sono public...
    ecco l'errore che restituisce...
    p.s. pubblicazioni è una classe intermedia...cioè libro e rivista estendono pubblicazioni che a sua volta estende articolo.

    Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    The method println(String) in the type PrintStream is not applicable for the arguments (String, String, String, String)
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    The method println(String) in the type PrintStream is not applicable for the arguments (String, String, String, String, int)
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved

    a sto punto non vorrei fosse un errore sintattico però a me sembra nn ci sia nulla

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da ratal
    Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    The method println(String) in the type PrintStream is not applicable for the arguments (String, String, String, String)
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    The method println(String) in the type PrintStream is not applicable for the arguments (String, String, String, String, int)
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    Syntax error on token ".", , expected
    indice cannot be resolved
    E' un errore alquanto strano: il compilatore rileva il passaggio di 4 argomenti String al metodo println() anche se, vedendolo così, non sembrerebbe.

    Credo che tutto sia dovuto al vatto che non riesce a risolvere la variabile "indice"... tu hai un oggetto "a" di cui non sappiamo niente, che dovrebbe avere un campo pubblico chiamato "indice" di tipo Articolo[] (è corretto?)...

    Se fosse corretto quanto dico allora non dovrebbe dare di questi errori... poi non so se esiste un campo pubblico chiamato "inventario" nella classe Articolo...

    Certo è che per facilitarti la vita dovresti cominciare ad utilizzare meglio l'incapsulamento: elimina i campi pubblici e sostituiscili con dei metodi pubblici che ritornano references a campi privati. Esempio, invece di avere un campo così:
    codice:
    public class TuaClasseA {
       public Articolo[] indice;
       ...
    }
    dovresti trasformare il tutto in questo modo:
    codice:
    public class TuaClasseA {
       private Articolo[] indice;
       ...
       public Articolo[] getIndice() { return indice; }
    }
    Casomai, prova a postare il codice completo (o linkalo da qualche parte per il download), perchè così è un po' difficile capire da cosa è dovuto l'errore.


    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    ciao lele,grazie mille...si lo so adesso li metto tutti privati con get...è che sto pasticciando un bel pò
    comunque ho risolto mettendo tre variabili:una libro una pubblicazioni e una rivista,ho fatto il cast diretto e poi agito su queste nuove variabili.la variabile a è una variabile di tipo biblioteca quindi contiene indice[i]

    ecco come funziona

    for(int i=0; i<a.indice.length; i++){
    p=(Pubblicazioni)a.indice[i];
    if (a.indice[i] instanceof Libro){
    s=(Libro)a.indice[i];
    System.out.println("Libro "+a.indice[i].inventario+" titolo "+p.getTitolo()+" di "+s.autore+" edizione "+s.edizione);
    }
    else if (a.indice[i] instanceof Rivista) {
    r=(Rivista)a.indice[i];
    System.out.println("Rivista "+a.indice[i].inventario+" titolo "+p.getTitolo()+" periodicità "+r.getPeriodicita()+" data "+r.getData()+" numero "+r.getNumero());
    }
    }

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.