如何通过传递泛型类型创建功能的多用途

时间:2019-06-05 11:16:29

标签: java

我正在寻找一种方法,该方法如何将泛型与函数一起传递以创建多用途函数。

以下功能仅用于获取事件集合,但是我想添加一个参数,例如根据参数来更改ResponseEntity和ParameterizedTypeReference的类型; List<Place>List<Page>

也许标题不正确,请进行编辑以使其易于理解。 预先感谢您的支持。

public List<Event> getEventList(String url) {
    List<Event> result = Collections.emptyList();
    ResponseEntity<List<Event>> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null,
            new ParameterizedTypeReference<List<Event>>() {
            });
    if (responseEntity.hasBody()) {
        result = responseEntity.getBody();
    }

    return result;
}

2 个答案:

答案 0 :(得分:2)

关于ParameterizedTypeReference的事情在于,将其通用化似乎在外观上很简单:

new ParameterizedTypeReference<List<T>>() {}

,但这不能正常工作:“实际” T在运行时不可用。列表的类型实际上是List<Object>

您必须提供具体的ParameterizedTypeReference作为参数:

public <T> List<T> getEventList(String url, ParameterizedTypeReference<List<T>> ptr) {
  List<T> result = Collections.emptyList();
  ResponseEntity<List<T>> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, ptr);
  if (responseEntity.hasBody()) {
    result = responseEntity.getBody();
  }

  return result;
}

调用方式:

List<Place> places = getEventList(url, new ParameterizedTypeReference<List<Place>>() {});
List<Page> pages = getEventList(url, new ParameterizedTypeReference<List<Page>>() {});

答案 1 :(得分:0)

如果我正确理解了您的问题:


public <T> List<T> getEventList(String url) { List<T> result = Collections.emptyList(); ResponseEntity<List<T>> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<T>>() { }); if (responseEntity.hasBody()) { result = responseEntity.getBody(); } return result; }