Список пользовательских объектов в качестве аргумента с универсальным методом - PullRequest
0 голосов
/ 11 октября 2018

Я использую универсальные методы в 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.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

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

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

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

  3. Даже если вы сделаете код, подобный следующему:

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

Вы вернетесь myResult как экземпляр ArrayList класса ...

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

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

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

0 голосов
/ 11 октября 2018

Не используйте аргумент 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);
0 голосов
/ 11 октября 2018

Если вы всегда возвращаете список элементов, тогда используйте 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 {

    }
...