Java использовать тип generi c в ResponseEntity, переданном в качестве параметра функции - PullRequest
1 голос
/ 19 апреля 2020

Я пытался отобразить ответ от API на конкретную c таблицу классов, где класс передается в качестве аргумента. У меня нет проблем с этой же операцией в ArrayList.

Например, fetchTestPhotos(url, PhotoDto.class) должен отображать ответ на ResponseEntity<PhotoDto[]>

Я попробовал код ниже, но он не работал.

public <T> void fetchTestPhotos(String url, Class<T> type) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<T[]> response = restTemplate.getForEntity(url, T[].class);

        if (response.getStatusCode().value() != 200) {
            throw new CannotFetchData("Cannot fetch data from " + url);
        }
    }

1 Ответ

0 голосов
/ 19 апреля 2020

Вы на самом деле не используете параметр type, переданный методу, который уже содержит Class<T>, который, как вы говорите, может быть PhotoDto.class. Просто используйте этот параметр:

ResponseEntity<T[]> response = restTemplate.getForEntity(url, type);

Кроме того, ваш метод возвращает тип void, а response не используется. Измените подпись и верните response.

public <T> ResponseEntity<T> fetchTestPhotos(String url, Class<T> type) {
    ....
    return response;
}

Наконец, если вы хотите вернуть ResponseEntity<T[]> с массивом generi c, вы также должны изменить формальные параметры. T и T[] не являются взаимозаменяемыми.

public <T> ResponseEntity<T[]>  fetchTestPhotos(String url, Class<T[]> type) {
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<T[]> response = restTemplate.getForEntity(url, type);

    if (response.getStatusCode().value() != 200) {
        throw new CannotFetchData("Cannot fetch data from " + url);
    }
    return response;
}
...