Список пользовательских объектов в качестве аргумента с универсальным методом
Я использую универсальные методы в 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 ответа
Код очень сломан...
List<myCustomObject>.class
неправильно это может быть толькоList.class
List
интерфейс и вызовList.class.newInstance();
все равно скину исключениеДаже если вы будете делать код как:
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);