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

    [java]problema con i generici vincolati

    Se io ho una classe Item,e voglio avere un ArrayList di tutti i tipi che estendono la classe Item, all' interno della classe main tra i vari campi dichiaro:
    codice:
    private ArrayList <? extends Item> lista;
    Poi però se voglio avere un metodo per aggiungere gli oggetti a questa lista, dichiaro:
    codice:
    public <T extends Item> void add(T item)
    {
        lista.add(item);
    }
    Mi da errore di sintassi:
    codice:
    cannot find symbol - method add(T); maybe you meant: add(? extends Item) or add (int, ? extends Item)
    Capisco quindi che il compilatore "non capisce" che il tipo che gli passo è corretto, perchè l' ArrayList è formata da qualsiasi oggetto appartenente a una classe che eredita da Item, io alla lista aggiungo un tipo T che eredita da Item, per cui tutto dovrebbe essere ok, ma perchè mi viene dato questo errore? Come risolvere?

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

    Re: [java]problema con i generici vincolati

    Originariamente inviato da ramy89
    Se io ho una classe Item,e voglio avere un ArrayList di tutti i tipi che estendono la classe Item, all' interno della classe main tra i vari campi dichiaro:
    codice:
    private ArrayList <? extends Item> lista;
    Attenzione ad una cosa (lo dico perché ho la sensazione che forse stai confondendo). Supponiamo che della tua classe Item ci siano 2 sottoclassi ItemX e ItemY.

    Se fai semplicemente:

    ArrayList<Item> lista = new ArrayList<Item>();

    Questa lista è già perfettamente in grado di contenere (anche in modo eterogeneo) oggetti di tipo Item ma anche ItemX, ItemY, ecc... (insomma, qualunque cosa che è-un Item).

    Parametrizzata in questo modo quindi puoi aggiungere oggetti che sono Item o sottotipi e puoi estrarre come Item.

    Se invece dichiari:

    ArrayList<? extends Item> lista;

    A questa variabile lista potrai assegnare un ArrayList<Item> o un ArrayList<ItemX> o ancora un ArrayList<ItemY>.
    Il punto è che la variabile lista, così come è parametrizzata, ti permette di estrarre gli elementi come Item ma NON ti permette di inserire elementi. Al massimo puoi inserire solo un null (che è il sottotipo di tutti i tipi reference).

    Questo perché <? extends Item> vuol dire "la parametrizzazione reale non so quale sia ma è di certo un sottotipo di Item".

    Se facessi:

    ArrayList<? extends Item> lista = new ArrayList<ItemX>();

    Il compilatore non può permettere di aggiungere un Item o un ItemY.


    Originariamente inviato da ramy89
    codice:
    public <T extends Item> void add(T item)
    {
        lista.add(item);
    }
    Se la variabile lista fosse ArrayList<Item> sarebbe corretto (la lista accetta qualunque cosa che è un Item e il add accetta un T che è certo essere un Item o sottotipo, quindi tutto quadra).
    Ma se lista è ArrayList<? extends Item> no, per il motivo detto sopra. "Non so come è parametrizzata la lista" (a parte sapere che il limite superiore è Item) ... ovviamente non posso aggiungere qualcosa.
    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.