获取Java中通用类型对象的字段

时间:2019-04-01 22:02:08

标签: java generics resttemplate

我有一个叫做“人”的班级:

public Class Person {
    String name;
    String address;
}

公共方法用于通过使用RestTemplate来返回Person对象,如下所示。我的问题是,如果我对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 个答案:

答案 0 :(得分:1)

在这种情况下,最简单的事情就是委托给实例。由于您没有办法确定该实例将是什么-实际上,它可能是任何东西-注销有关响应的关键信息的最有效方法是仅调用toString response

这意味着您需要在toString上附加合适的Person方法,以显示名称和地址。

要处理instanceof或其他任何令人毛骨悚然的事情,其他都是冒险和脆弱的,当您需要引入必须记录的新类时。

答案 1 :(得分:0)

有两种合理的方法。

  • Person实现了一个Printable接口并声明了T extends Person。 (使用Object::toString可以简化此过程,但这可能是错误的选择。)
  • 添加一个适配器(可能是功能性的)接口Printer(甚至是Printer<T>)来代表Person。编写一组重载的静态(或非静态)函数,以将Person之类的内容包装到Printer中(甚至以内联形式编写为lambda)。