Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Как параметризовать статический метод в дженериках Java? Как они типизируются?

ПрограммированиеJavascriptJava
Альберт
Java
  · 3,6 K
Делаю программное обеспечение на заказ.  · 12 мар 2022
Дженерики в 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();
    }
}
Для более удобного доступа к свойствам и методам можно использовать commons-beanutils, для вызова конструктора — ConstructorUtils из той же библиотеки или из commons-lang3, а с помощью Optional можно спрятать все исключения под капотом, не выбрасывая null.
Пример:
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());
        }
    }
}
Java Developer, Development Team Lead, Java Teacher  · 28 дек 2021
Собственно так же как и все методы в java. Пример ради примера: public class Main { public static void main(String[] args) { List<Integer> listInt = getList(1, 2); List<String> listString = getList("2, 3"); System.out.println(listInt); // [1, 2] System.out.println(listString); // [2, 3] } public static <T> List<T>... Читать далее
2 эксперта согласны
только с учетом, что List.of() появился с Java 9, в 8 придется написать ==> return Arrays.asList(arg);