RestTemplate получить список объектов - зачем использовать ParameterizedTypeReference вместо массива объектов? - PullRequest
2 голосов
/ 06 октября 2019

Я пытаюсь получить список объектов, используя Spring RestTemplate. Я не совсем понимаю, почему выбираю подход ParameterizedTypeReference для получения списка объектов, используя restTemplate, а не просто Object []. Class?

Я проверил несколько ответов, предлагая использовать ParameterizedTypeReference. Но почему я не могу просто использовать Object []. Class? Какие ограничения у меня есть?

Я проверил эту ссылку (https://stackoverflow.com/a/49752261/6001027), где указано, что я могу использовать Object [] только для простых случаев и должен получить ParameterizedTypeReference при обработке сложных структур json. Может кто-нибудь объяснить мне, в каких случаях я не могу использовать подход Object []?

Подход ParameterizedTypeReference:

ResponseEntity<List<Rating>> responseEntity =
                restTemplate.exchange("http://localhost:8084/ratingsdata/user/" + userId,
                        HttpMethod.GET, null, new ParameterizedTypeReference<List<Rating>>() {
                        });
List<Rating> ratings = responseEntity.getBody();

Подход Object []:

List<Rating> ratings = Arrays.asList(restTemplate.getForObject("http://localhost:8084/ratingsdata/user/"+userId, Rating[].class));

1 Ответ

1 голос
/ 06 октября 2019

Ответ прост, чтобы сохранить информацию о типе во время выполнения.

Список может действовать как массив, но массив не может действовать как список. Почему то, что вы делаете, работает, потому что вы приводите массив к списку, и, как уже говорилось, список может действовать как массив, так что в этот раз вы в безопасности.

Но кастинг, в общем-то, плохая практика.

Когда вы разыгрываете что-то, на что вы рискуете, вы в основном заставляете компилятор «доверять вам» в том, что вы делаете. Таким образом, вместо того, чтобы компилятор говорил вам, что правильно или неправильно, вы говорите компилятору, что правильно и что неправильно, и это риск, риск поломки. Трудно, потому что , если вы ошибаетесь во время выполнения, мы можем потерпеть крах. Трудно и неуправляемо.

Есть много программистов с множеством мнений, но есть только один компилятор с одним мнением, и мы должны ему доверять.

Итак, вернемся к вопросу, что делаетParameterizedTypeReference<T>.class на самом деле?

Если вы посмотрите на его конструктор, вы увидите, что он действует как сосуд для информации о типе. Делая new ParameterizedTypeReference<List<Foo.class>> {};, вы создаете экземпляр анонимного класса при передаче типа. Затем в конструкторе он извлекает информацию о типе из переданного типа и сохраняет ее внутри. Затем в более поздний момент мы можем сделать getType(), чтобы получить информацию о типе, чтобы мы могли выполнять типизированное «приведение» во время выполнения.

    final ParameterizedTypeReference<List<String>> typeRef = new ParameterizedTypeReference<>() {};
    final Type type = typeRef.getType();
    final String typeName = type.getTypeName();
    System.out.println(typeName);
    // will print "java.util.List<java.lang.String>"

Этот шаблон называется «Супер-токены», и вы можете прочитатьПодробнее об этом здесь Блог Нила Гафтера - Супер Тип Жетоны

...