Список пользовательских объектов в качестве аргумента с универсальным методом

Я использую универсальные методы в Java, и я хотел бы использовать в качестве аргумента список пользовательских объектов.

Мой основной класс такой:

public class Main {

    public static <T> T executeGetRequest(String target, Class<T> resultClass) {

        //MY STUFF
        T result = resultClass.newInstance();
        return result;
    }

    public static void main(String[] args) {
        executeGetRequest("myList", List<myCustomObject>.class); // ERROR HERE
    }
}

Я хотел бы использовать в качестве аргумента List<myCustomeObject>, Когда я использую List.class, нет ошибки, но я не уверен, что результат будет приведен в myCustomObject,

4 ответа

Код очень сломан...

  1. List<myCustomObject>.class неправильно это может быть только List.class

  2. List интерфейс и вызов List.class.newInstance(); все равно скину исключение

  3. Даже если вы будете делать код как:

    List<myCustomClass> myList = new ArrayList(); Object myResult = executeGetRequest("myList", myList.getClass());

Ты вернешься myResult как пример ArrayList учебный класс...

Вы должны пересмотреть то, что вы пытаетесь достичь - вернуть список myCustomClass объекты или новый экземпляр myCustomClass

Кстати: во время выполнения происходит "стирание типа", и нет способа узнать, какие типы объектов находятся в List от List реализация.

Короче во время выполнения это всегда List<Object>

Не используйте Class<T> аргумент, наряду с отражением (т.е. Class.newInstance()). Использовать Supplier<T> вместо:

public static <T> T executeGetRequest(String target, Supplier<T> factory) {

    // MY STUFF

    T result = factory.get();
    return result;
}

Затем вызовите его следующим образом:

List<myCustomObject> result = executeGetRequest("myList", () -> new ArrayList<>());

Вы даже можете использовать алмазный оператор (<>) при создании ArrayList, так как это выведено с левой стороны компилятором (то есть List<myCustomObject>).

Вы также можете использовать ссылку на метод:

List<myCustomObject> result = executeGetRequest("myList", ArrayList::new);

Если вы всегда возвращаете список товаров, используйте List<T> в качестве типа возврата:

public class Main {

    public static <T> List<T> executeGetRequest(String target, Class<T> resultClass) throws IllegalAccessException, InstantiationException {

        T item = resultClass.newInstance();
        List<T> result = new ArrayList<>();
        result.add(item);

        return result;
    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        executeGetRequest("myList", Foo.class);
    }

    static class Foo {

    }

При использовании Spring:

      import org.springframework.core.ParameterizedTypeReference;

и использовать

      executeGetRequest("myList", new ParameterizedTypeReference<List<MyCustomObject>() {
                });

вместо

      executeGetRequest("myList", List<myCustomObject>.class);
Другие вопросы по тегам