Можно, если вы передадите тип в качестве параметра метода.
static <T> List<T> createEmptyList( Class<T> type ) {
return new ArrayList<T>();
}
@Test
public void createStringList() {
List<String> stringList = createEmptyList( String.class );
}
Методы не могут быть обобщены так же, как это может сделать тип, поэтому единственная опция для метода с динамически типизированным универсальным возвращаемым типом - phew, который глотает :-) - это передать тип как аргумент.
Для действительно превосходного FAQ по дженерикам Java, см. FAQ по дженерикам Анжелики Лангер .
.
,
Последующий:
В этом контексте не имеет смысла использовать аргумент массива, как в Collection.toArray( T[] )
. Единственная причина, по которой здесь используется массив, заключается в том, что тот же (предварительно выделенный) массив используется для хранения результатов (если массив достаточно большой, чтобы вместить их всех). Это экономит на выделении нового массива во время выполнения.
Однако, для целей обучения, если вы хотите использовать типизацию массива, синтаксис очень похож:
static <T> List<T> createEmptyList( T[] array ) {
return new ArrayList<T>();
}
@Test
public void testThing() {
List<Integer> integerList = createEmptyList( new Integer[ 1 ] );
}