Mentre stavo lavorando a un progetto che coinvolge i nuovi stream di Java 8, ho notato che quando ho chiamato Stream#toArray()
su uno stream, restituisce uno Object[]
anziché uno T[]
. Sorpreso com'ero, ho iniziato a scavare nel codice sorgente di Java 8 e non ho trovato alcun motivo per cui non implementassero Object[] toArray();
come T[] toArray();
. C'è qualche ragionamento dietro questo, o è solo una (in) coerenza?Perché i nuovi stream Java 8 restituiscono una matrice di oggetti sulle chiamate toArray?
MODIFICA 1: Ho notato nelle risposte che molte persone hanno affermato che ciò non sarebbe possibile, ma questo frammento di codice viene compilato e restituisce il risultato previsto?
import java.util.Arrays;
public class Test<R> {
private Object[] items;
public Test(R[] items) {
this.items = items;
}
public R[] toArray() {
return (R[]) items;
}
public static void main(String[] args) {
Test<Integer> integerTest = new Test<>(new Integer[]{
1, 2, 3, 4
});
System.out.println(Arrays.toString(integerTest.toArray()));
}
}
Come farebbe a sapere "R"? Se vuoi che vengano restituiti tipi specifici, passa un generatore al metodo. Ad esempio per un array di stringhe, effettuare quanto segue: 'streamString.toArray (String [] :: new)' – meskobalazs
'R' è il parametro type dell'interfaccia Stream. Ho usato 'R' nella mia domanda, ma dovrebbe essere' T'. Aggiornerà quello – Martijn
@meskobalazs Ma ancora, nel peggiore dei casi, potresti lanciarlo sul tipo desiderato. Perché hanno scelto di percorrere il percorso con caratteri jolly anziché il percorso digitato? A volte mi rendo conto che non è noto al programmatore che tipo di stream abbia dovuto occuparsene, non è il miglior codice. E il flusso è ancora quello che sa esattamente che tipo contiene. – Martijn