Дженерики в Java существуют только во время компиляции. Это значит, что во время выполнения нельзя достать из них информацию. Поэтому, чтобы параметризовать метод, нужно передать ему объект, в котором будет содержаться информация о типе. Это может быть либо просто объект этого типа или объект-класс.
Если передаётся класс и в методе происходит создание объекта или вызов методов у него, придётся обрабатывать ситуации, когда конструктор или метод отсутствует или к ним нет доступа.
public static <T> T myMethod(Class<T> aClass)
throws ReflectiveOperationException {
return aClass.newInstance();
}
public static void main(String[] args) {
try {
String a = myMethod(String.class);
System.out.println(a.length());
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
Пример:
import org.apache.commons.lang3.reflect.ConstructorUtils;
import java.lang.reflect.Constructor;
import java.util.Objects;
import java.util.Optional;
public class Foo {
public static <T> Optional<T> bar(Class<T> aClass) {
Constructor<T> ctor = ConstructorUtils.getAccessibleConstructor(aClass);
if (Objects.nonNull(ctor)) {
try {
return Optional.of(ctor.newInstance());
} catch (ReflectiveOperationException e) {
return Optional.empty();
}
} else {
return Optional.empty();
}
}
public static void main(String[] args) {
Optional<String> a = bar(String.class);
if (a.isPresent()) {
System.out.println(a.get().length());
}
}
}