Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Metodo get() di ArrayList

    Salve, analizzando un codice ho trovato alcune istruzioni che non mi sono chiare...

    codice:
    ArrayList matrice = new ArrayList();
    matrice.add(new ArrayList());
    matrice.add("Mario");
    matrice.add(234);
    matrice.add(true);
    matrice.add(new int[10]);
    
    ((ArrayList)matrice.get(0)).add("Pia");
            
    System.out.println("La matrice di ArrayList e': " + matrice);
    Il tutto inserito in un metodo main() di una classe che importa java.util.ArrayList.

    Il risultato è:
    codice:
    La matrice di ArrayList e': [[Pia], Mario, 234, true, [I@15db9742]
    Il metodo get() dovrebbe restituire l'elemento presente nella posizione indicata dall'index (0 in questo caso, quindi il primo, "Mario", come tra l'altro pare darmi ragione questo esempio https://www.tutorialspoint.com/java/...aylist_get.htm
    Il casting, se ho ben capito, serve per fare accettare l'elemento in posizione 0 che altrimenti è visto come Object generico (matrice non dichiara un tipo <String> piuttosto che <Integer>, ecc...) ai fini dell'invocazione del get().
    Dall'output pare però che sia la String "Pia" a ricevere il casting, visto che appare come [Pia], inoltre in posizione 0...
    Per cui ho delle perplessità in merito.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    L'ArrayList matrice è stato creato usando il raw-type (quindi, non è tipizzato). Di conseguenza, quella matrice è esattamente come fosse stata creata come ArrayList<Object>.

    Il primo elemento di tale ArrayList è esso stesso un ArrayList (anche questo di Object, essendo stato usato ancora una volta il raw-type) al cui primo elemento viene inserita la stringa "Pia".
    Il resto degli elementi sono, nell'ordine, la stringa "Mario", l'intero 234, un booleano (true) e un array di interi.

    Il casting viene fatto sul primo elemento di matrice per ottenere correttamente un ArrayList a cui viene aggiunta la stringa "Pia".

    L'output è abbastanza chiaro: stampare un arraylist produce l'elenco dei suoi elementi fra parentesi quadre.
    Il primo elemento è esso stesso un ArrayList, quindi viene stampato il suo contenuto fra parentesi quadre... ecco perchè il primo elemento è "[Pia]" perchè è il contenuto dell'ArrayList posto al primo elemento di matrice... il quale contiene solo la stringa "Pia".

    Vedilo così':

    codice:
    [
       [
          Pia
       ],
    
       Mario,
    
       234,
    
       true,
    
       [I@15db9742
    ]

    Ciao.
    Ultima modifica di LeleFT; 14-09-2017 a 17:32
    "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
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    In posizione 0 dell'ArrayList c'è un' altra ArrayList! Il primo add è infatti:

    codice:
    matrice.add (new ArrayList ());

    Tu vedi [Pia] nella prima posizione solo perché all'elemento in prima posizione (la lista) è stata aggiunta la stringa Pia (dopo il casting), e quando fai il println della lista in automatico viene invocato il metodo toString specifico di ogni oggetto, che nel caso di una lista mostra i propri elementi, separati da virgole e racchiusi da parentesi quadre.
    Ultima modifica di Ansharja; 14-09-2017 a 17:32

  4. #4
    Quindi la traduzione di questa istruzione:
    codice:
    ((ArrayList)matrice.get(0)).add("Pia");
    è "prendi l'elemento in posizione 0 di matrice e aggiungici Pia.
    E il casting (ArrayList) perché si fa, se l'elemento 0 di matrice è già un ArrayList (al momento vuoto)? Almeno stando all'ordine delle parentesi...

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Il casting lo fai perché l'ArrayList non è tipizzato, quindi è fatto per contenere Object, e a livello di compilazione il compilatore NON può sapere cosa troverà alla posizione 0 della lista.
    Se avessi un ArrayList <ArrayList> il casting non servirebbe, ma un Object ovviamente non può avere il metodo add ...

    Ovviamente a runtime il casting fallirà con una ClassCastException se l'elemento trovato non fosse un ArrayList (o un derivato).

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    E il casting (ArrayList) perché si fa, se l'elemento 0 di matrice è già un ArrayList (al momento vuoto)?
    Essendo la lista non parametrizzata, tratta solo Object, il get restituisce Object. E Object non ha ovviamente il add(). Quindi devi per forza mettere un cast per "rivedere" l'oggetto come ArrayList.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7

Tag per questa discussione

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