Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    7

    [JAVA] Tipi generici con esempio pratico

    Ciao.
    mi sto imbattendo nei tipi generici, ma mi sfugge il loro utilizzo, quando provo a creare un programmino java va sempre in errore in compilazione.
    Chi è cosi gentile da aiutarmi con un esempio pratico? in particolare, vorrei creare un inventario di oggetti diversi.
    Per didattica ho creato una classe astratta Prodotto con un solo parametro marca
    poi classi Monitor, Stampante e Notebook che estendono Prodotto.
    Alla fine vorrei creare una List<?> di ArrayList() e includere i tre oggetti diversi.

    Mi sfugge come parametrizzare le classi, come accedere ai loro attributi e come stampare il contenuto dell'inventario.
    Non riesco neanche ad aggiungere gli oggetti.

    Questo quello che ho fatto
    codice:
    public abstract class Prodotto {
        private String marca;
        public String getMarca() {
            return marca;
        }
        public void setMarca(String marca) {
            this.marca = marca;
        }
    }
    
    public class Monitor extends Prodotto {
        private String tipo; //LCD o LED
        private int dimensioniPollici;
        public String getTipo() {
            return tipo;
        }
        public void setTipo(String tipo) {
            this.tipo = tipo;
        }
        public int getDimensioniPollici() {
            return dimensioniPollici;
        }
        public void setDimensioniPollici(int dimensioniPollici) {
            this.dimensioniPollici = dimensioniPollici;
        }    
    }
    
    public class Notebook extends Prodotto {
        private int ram; //GByte
        private String cpu;
        public int getRam() {
            return ram;
        }
        public void setRam(int ram) {
            this.ram = ram;
        }
        public String getCpu() {
            return cpu;
        }
        public void setCpu(String cpu) {
            this.cpu = cpu;
        }
    }
    
    public class Stampante extends Prodotto {
        private String tipo; //Laser, InkJet
        public String getTipo() {
            return tipo;
        }
        public void setTipo(String tipo) {
            this.tipo = tipo;
        }
    }
    
    
    import java.util.ArrayList;
    public class Inventario {
        Monitor m = new Monitor();
        Stampante s = new Stampante();
        Notebook n = new Notebook();
        
        List<?> l = new ArrayList<>(); // NON FUNZIONA !!!!!
        
        ArrayList<Monitor> list1 = new ArrayList<>(); //OK
        ArrayList<Stampante> list2 = new ArrayList<>(); //OK
        ArrayList<Notebook> list3 = new ArrayList<>(); //OK
        ArrayList<?> list4 = new ArrayList<>(); //OK
        
        public void aggiungiOggetto() {
            list1.add(m);  //OK
            list2.add(s);  //OK
            list3.add(n);  //OK
    
            list4.add(s); //The method add(capture#1-of ?) in the type ArrayList<capture#1-of ?> is not applicable for the arguments (Stampante)
        }
    }
    Non capisco perché List<?> l = new ArrayList<>() non funziona, restituisce
    List cannot be resolved to a type
    Cannot infer type arguments for ArrayList<>

    e comunque non riesco ad aggiungere oggetti diversi alla lista. Dovrei parametrizzare anche le classi?
    Mi serve un esempio pratico per capire, il libro spiega in via teorica senza esempi e solo con list<String>.

    Grazie mille
    tagan

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,848
    Quote Originariamente inviata da tagan
    Alla fine vorrei creare una List<?> di ArrayList() e includere i tre oggetti diversi.
    In quel caso, puoi creare una List<Prodotto> per ottenere una lista tipizzata che però accetta solo oggetti di tipo Prodotto e relativi discendenti.


    Quote Originariamente inviata da tagan
    Non capisco perché List<?> l = new ArrayList<>() non funziona, restituisce
    List cannot be resolved to a type
    Cannot infer type arguments for ArrayList<>
    Non funziona in quanto, per poter creare una lista concreta, il parametro "generico" - ossia quello che permette di specificare il tipo desiderato - deve essere specificato per forza, altrimenti è impossibile creare la lista.

    Supponiamo che sia possibile creare una lista con la tua dichiarazione sopra... qual è il tipo di dato che tale lista dovrebbe accettare o rifiutare, se non viene indicato?

    Quando crei una istanza di un tipo "generico", devi sostituire e quindi risolvere tutti i segnaposto con il tipo che vuoi utilizzare effettivamente; in caso contrario, non è possibile - e non ha neanche senso - creare l'oggetto.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    7
    Quote Originariamente inviata da alka Visualizza il messaggio
    Non funziona in quanto, per poter creare una lista concreta, il parametro "generico" - ossia quello che permette di specificare il tipo desiderato - deve essere specificato per forza, altrimenti è impossibile creare la lista.

    Ciao!
    Perfetto.
    capito tutto.

    Mi mancava una classe generica e l'ho creata come ProdottoPerLista <T> con il suo parametro T obj
    e poi la lista l'ho definita come List<ProdottoPerLista>. in questo modo mi creo dentro la classe generica ogni tipo di oggetto e la aggiungo alla lista.
    Era questo che mi sfuggiva.

    mi sono creato un
    list.add(new ProdottoPerLista(new Monitor))
    list.add(new ProdottoPerLista(new Notebook))
    list.add(new ProdottoPerLista(new Stampante))

    poi quando ho fatto la stampa, modificando ad hoc il metodo toString mi ha stampato i dati corretti.

    Grazie
    Ora funziona tutto. Cmq non è facile implementare un generico, e non è neanche facile capire quando conviene.
    Bisogna studiarla bene perché se poi mi servono tutti i dati devo cmq fare un test con instanceof per vedere che tipo di oggetto è.
    Tagan

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,109
    Sposto nel forum Java.

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