Получить поля объекта универсального типа в Java - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть класс с именем "Person":

public Class Person {
    String name;
    String address;
}

Открытый метод используется для возврата объекта Person с помощью RestTemplate, как показано ниже. Мой вопрос заключается в том, как мне напечатать имя и адрес объекта Person, если я использую универсальный тип T для Person? Я знаю, что могу сделать «instanceOf», но если «log» должен обрабатывать много разных типов, то мне придется делать «instanceOf» для каждого из них. У кого-нибудь есть лучший подход? Спасибо.

public Person getPerson(SomeObject request) throws Exception {

    String url =......;
    return post(url, request, Pereson.class);
}

// This method can be used by response types other than Person
private <T> T post(String url, 
                   Object request, 
                   Class<T> responseType) throws Exception {

    T response = 
          restTemplate.postForObject(url, request, responseType);

    log(response, responseType);
    return response;
  }

private <T> void log(T response, 
                     Class<T> responseType) throws Exception {

    // how do I print the name and the address of the 
    // Person response object here?
 }

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

В этом контексте проще всего сделать делегирование экземпляру.Поскольку у вас нет способа определить , каким будет этот экземпляр - это может быть что угодно, на самом деле - самый эффективный способ выйти из критической информации об ответе - просто вызвать toString на response.

Это означает, что вам нужен подходящий toString метод, присоединенный к Person, который отображает имя и адрес.

Anything else - работа с instanceofили любые хитрые заклинания - это слишком рискованно и хрупко, когда вам нужно вводить новые классы, которые нужно регистрировать.

0 голосов
/ 02 апреля 2019

Есть пара разумных подходов.

  • У Person реализован интерфейс Printable и объявлено T extends Person. (Использование Object::toString делает это проще, но это может быть неправильно).
  • Добавьте адаптер (возможно, функциональный) интерфейс Printer (или даже Printer<T>), чтобы заменить Person. Напишите набор перегруженных статических (или нет) функций для переноса подобных Person в Printer s (или даже напишите inline как лямбду).
...