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 die gleiche Art und Weise genericised werden, dass ein Typ kann, so dass die einzige Option für ein Verfahren mit einem dynamisch typisierte generischen Rückgabetyp - puh, dass ein Schluck :-) ist - ist in weitergeben der Typ als Argument.
Für eine wirklich hervorragende FAQ zu Java-Generika, see Angelika Langer's generics FAQ.
.
.
Follow-up:
Es wäre nicht sinnvoll, in diesem Zusammenhang macht das Array-Argument wie in Collection.toArray(T[])
zu verwenden. Der einzige Grund dafür, dass ein Array verwendet wird, besteht darin, dass das gleiche (vorab zugewiesene) Array verwendet wird, um die Ergebnisse zu enthalten (wenn das Array groß genug ist, um alle zu berücksichtigen). Dies spart die ständige Zuweisung eines neuen Arrays zur Laufzeit.
jedoch für die Zwecke der Bildung, wenn Sie die Array Typisierung verwenden wollen, 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 ]);
}
Cheekysoft erklärt, warum, aber wenn Sie wirklich das Bedürfnis verspüren, den zweiten Typ def hinzufügen, fügen Sie einfach den Klassennamen vor dem statischen Funktionsaufruf: Liste myList = MyClass. createEmptyList(); –