Während ich an einem Projekt mit den neuen Streams von Java 8 arbeitete, bemerkte ich, dass, wenn ich Stream#toArray()
in einem Stream anrief, es Object[]
anstelle von T[]
zurückgab. Überrascht wie ich war, fing ich an, in den Quellcode von Java 8 zu graben und konnte keinen Grund finden, warum sie Object[] toArray();
nicht als T[] toArray();
implementiert haben. Gibt es Gründe dafür, oder ist es nur eine (un) Konsistenz?Warum geben die neuen Java 8-Streams ein Object Array anArray-Aufrufe zurück?
EDIT 1: Ich bemerkte in den Antworten, dass viele Leute sagten, dass dies nicht möglich wäre, aber dieses Code-Snippet kompiliert und das erwartete Ergebnis zurückgibt?
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()));
}
}
Wie würde es 'R' wissen? Wenn bestimmte Typen zurückgegeben werden sollen, übergeben Sie einen Generator an die Methode. Führen Sie beispielsweise für ein String-Array die folgenden Schritte aus: 'streamString.toArray (String [] :: new)' – meskobalazs
'R' ist der Typparameter der Stream-Schnittstelle. Ich habe "R" in meiner Frage verwendet, aber es sollte "T" sein. Wird das aktualisieren. – Martijn
@meskobalazs Aber, schlimmstenfalls Szenario, könnten Sie es auf den gewünschten Typ umwandeln. Warum haben sie sich dafür entschieden, anstelle des eingegebenen Pfades den Platzhalterpfad zu wählen? Ich habe manchmal das Gefühl, dass es dem Programmierer nicht bekannt ist, welchen Typ-Stream er hat, um den besten Code zu erstellen. Und der Strom ist immer noch derjenige, der genau weiß, welchen Typ er enthält. – Martijn