Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Creare un array di T

  1. #1

    Creare un array di T

    Salve a tutti volevo creare un'array che contenesse i valori dei figli di un nodo v di un'albero generico; e dato che ogni nodo contiene valori di tipo T (tipo generico) allora l'array dovrà contenere valori di tipo T...
    Il problema è che eclipse mi dice "cannot create a generic array of T"
    come mai?
    c'è qualche soluzione?

    Il codice è qui sotto:
    codice:
    public T [] listaFigliNodo(NodoPFFS<T> v)
    	{
    
    		T [] lista=new T [NumeroFigli(v)]; //Mi da errore QUI
    		if(NumeroFigli(v)>0)
    		{
    			lista[0]= v.getfiglio().getdata();
    			NodoPFFS<T> x=v.getfiglio();
    			for(int k=1;x.getfratello()!=null;k++)
    			{
    				lista[k]=x.getfratello().getdata();
    				x=x.getfratello();	
    			}
    				
    		}
    		
    		return lista;
    	}

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

    Re: Creare un array di T

    Originariamente inviato da mattealex
    Il problema è che eclipse mi dice "cannot create a generic array of T"
    come mai?
    Basta conoscere molto bene i generics. (questa infatti è una questione molto avanzata e delicata).

    Gli array sono istanziabili solo di tipi "reifiable" (reificabili, ovvero di cui viene mantenuta una completa informazione sul tipo a runtime). E "T" (la type variable che stai usando) non è reifiable.

    Qualcosa per aggirare il problema c'è, le soluzioni in generale sono 2:

    a)
    T[] arr = (T[]) new Object[size];

    b)
    Object[] arr = new Object[size];

    e poi, a parte settare valori nell'array che non dà problemi, dove serve un elemento di tipo T, estrarre l'elemento dall'array facendo un cast (T) dove necessario.

    Ma la questione è che qui le cose diventano molto delicate. Nel tuo caso il tuo listaFigliNodo dichiara di ritornare T[]. NON puoi usare nessuna delle due soluzioni, perché in entrambi i casi l'array istanziato realmente è Object[] e se per fare un esempio una istanziazione specifica della tua classe fosse <String>, il compilatore metterebbe un cast (String[]) che fallirebbe, perché un array Object[] NON è un String[].

    In questi casi l'unica cosa da fare sarebbe passare a quel metodo un array in modo che il metodo possa "scoprire" di che tipo deve istanziare l'array!

    Hai mai notato che tutte le Collection hanno 2 metodi:

    Object[] toArray()
    <T> T[] toArray(T[] a)

    ?

    Non è un caso che il secondo riceva T[] quando invece basterebbe solo averlo in output come ritorno!

    Il primo metodo infatti "reifica" l'array di tipo Object[] mentre il secondo riceve un array e se non ha capacità sufficiente, tramite reflection ne istanzia uno dello stesso tipo.

    Ripeto, per non dilungarmi troppo: stai camminando su un terreno molto fragile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    In pratica come dovrei fare?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mattealex
    In pratica come dovrei fare?
    Se non puoi fare a meno di restituire dal metodo un T[], allora devi fare esattamente come fa il T[] toArray(T[] a) delle Collection: il metodo riceve un array (che potrebbe anche essere "vuoto", lunghezza 0), se vede che non è sufficiente, tramite reflection istanzia un array di quello stesso tipo (se invece è sufficiente ovviamente usa quello!).

    Suggerimento: dai una sbirciatina al sorgente della classe java.util.LinkedList per vedere il suo toArray(T[])
    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.