Проблемы с дженериками в Java

Я использую платформу RestAssured для вызовов API и хочу создать метод, который будет возвращать значение из ответа JSON в определенном типе переменной.
Я хочу использовать общий тип возвращаемого значения, но мне не нравится моя реализация.
RestAssured getList() возвращает список значений в соответствии с путем JSON и приводится к типу значения. Когда я реализую метод getList(), я должен привести результат к T, чтобы соответствовать типу возвращаемого значения:

public <T> T getValuesFromResponse(Response response, ValueTypeEnum value) {
    T t = null;
    switch (value) {
        case ID:
            //Will return List<Integer>
            t = (T) response.thenReturn().jsonPath().getList("data.id", Integer.class);
            break;
        case NAME:
            //Will return List<String>
            t = (T) response.thenReturn().jsonPath().getList("data.name", String.class);
            break;
    }
    return t;
}

Когда я хочу вызвать этот метод, мне нужно снова привести значения к нужному мне типу, т.е.:

((List<Integer>) getValuesFromResponse(response, ValueTypeEnum.ID)).get(0)

Как избежать двойного приведения?
Правильно ли моя реализация использует общий тип возврата List<T>?


person Leon Proskurov    schedule 18.05.2020    source источник
comment
Я пробовал это, но он не компилируется. public <T> List<T> getValuesFromResponse(Response response, DeviceValues value) { return response.thenReturn().jsonPath().getList("data.id", Integer.class); } ошибка: Несовместимое ограничение равенства: T и Integer   -  person Leon Proskurov    schedule 18.05.2020


Ответы (1)


Что вы думаете об использовании такого метода:

 public <T> List<T> getValuesFromResponse(Response response, String key, Class <T> clazz) {
    return response.thenReturn().jsonPath().getList(key, clazz);
}

... а затем назовите это как:

List<Integer> listOfIds = getValuesFromResponse (response, "data.id", Integer.class);
List<String> listOfNames = getValuesFromResponse (response, "data.name", String.class);

Я не пробовал компилировать его с настоящим классом Response, но думаю, что это должно сработать. Пожалуйста, дай мне знать.

person Slavomir    schedule 18.05.2020
comment
Это работает, но требует, чтобы пользователь определил тип возвращаемого класса, а я хотел, чтобы он был более общим. странно, что если я использую clazz, который определен как Integer.class, он компилируется, но если я использую прямой Integer.class, он не будет - person Leon Proskurov; 18.05.2020
comment
Если я правильно понимаю, вы хотите иметь метод, который возвращает список объектов определенного класса, чтобы избежать приведения типов. И хотят только передать ValueTypeEnum. Это значение перечисления представляет: (1) имя поля в ответе, например: «data.name» и (2) тип (класс объектов), который будет содержать список, например: «String» . Идентификация значений ValueTypeEnum означает, что это обработка во время выполнения, а отсутствие приведения типов означает, что мы знаем во время компиляции, какой класс возвращается в конкретном сценарии. Я не уверен, что эти два варианта возможны одновременно. Удачи. - person Slavomir; 18.05.2020