mark22 ha scritto:
T[] array = (T[])new Object[this.size]; //<---??
E' corretto anche il cast in riga 3?
Sì, il cast è appropriato in questa circostanza. Causa un warning di
unchecked cast, perché il compilatore non può "provare" che sia corretto. Ma il cast non compromette nulla a livello pratico. Un array Object[] può contenere oggetti di qualunque tipo, quindi qualunque sia poi la parametrizzazione concreta usata per istanziare la tua classe, gli oggetti che riceve possono certamente stare nel Object[].
Il warning lo puoi "sopprimere" con la annotazione @SuppressWarnings("unchecked")
Il toArray che hai fatto lo stavi pensando per l'uso da parte del shuffle e va bene. Ma il toArray l'hai fatto public, quindi potrebbe invocarlo chiunque dall'esterno. Se SERVE davvero un toArray anche all'esterno, allora sarebbe utile un ALTRO toArray, più appropriato, che riceva già un array, in modo che il metodo possa usarlo come destinazione o per "copiare" il tipo creandone uno nuovo. Questa è appunto la differenza tra
public Object[] toArray()
e
public <T> T[] toArray(T[] a)
di tutte le Collection del framework