Sie können, wenn Sie den Typ als Methodenparameter übergeben.
static <T> List<T> createEmptyList( Class<T> type ) {
return new ArrayList<T>();
}
@Test
public void createStringList() {
List<String> stringList = createEmptyList( String.class );
}
Methoden können nicht auf dieselbe Weise generisch gemacht werden wie ein Typ, so dass die einzige Option für eine Methode mit einem dynamisch typisierten generischen Rückgabetyp - puh, das ist ein Zungenbrecher :-) -- ist die Übergabe des Typs als Argument.
Für eine wirklich ausgezeichnete FAQ über Java-Generika, siehe Angelika Langers FAQ zu Generika .
.
.
Nachbereitung:
Es würde in diesem Zusammenhang keinen Sinn machen, das Array-Argument zu verwenden, wie in Collection.toArray( T[] )
. Der einzige Grund, warum dort ein Array verwendet wird, ist, dass dasselbe (vorab zugewiesene) Array verwendet wird, um die Ergebnisse zu enthalten (wenn das Array groß genug ist, um sie alle unterzubringen). Dies erspart das ständige Zuweisen eines neuen Arrays zur Laufzeit.
Wenn Sie jedoch die Array-Typisierung verwenden möchten, ist die Syntax sehr ähnlich:
static <T> List<T> createEmptyList( T[] array ) {
return new ArrayList<T>();
}
@Test
public void testThing() {
List<Integer> integerList = createEmptyList( new Integer[ 1 ] );
}
1 Stimmen
Cheekysoft erklärt warum, aber wenn Sie wirklich das Bedürfnis haben, den zweiten Typ def hinzuzufügen, fügen Sie einfach den Klassennamen vor dem Aufruf der statischen Funktion hinzu: List<Integer> myList = MyClass.<Integer>createEmptyList();