返回具有泛型输入的嵌套对象

时间:2017-07-20 11:37:47

标签: java generics boilerplate

我有以下对象初始化。它是RestfulService类的一部分。

ParameterizedTypeReference<RestResponsePage<ScheduledScanDto>> ptr =
            new ParameterizedTypeReference<RestResponsePage<ScheduledScanDto>>(){};

它在课堂上使用了好几次但有不同的参数。例如

ParameterizedTypeReference<RestResponsePage<ScanDto>> ptr =
            new ParameterizedTypeReference<RestResponsePage<ScanDto>>(){};

ParameterizedTypeReference<RestResponsePage<SomeOtherObject>> ptr =
            new ParameterizedTypeReference<RestResponsePage<SomeOtherObject>>(){};

它有点罗嗦......我正在尝试创建一个私有方法来返回ParameterizedTypeReference对象作为私有方法的一部分。这将减少类中的样板代码和代码重复。我正在努力使用私有​​方法的语法,特别是泛型的嵌套。

想通过执行以下操作获取ParameterizedTypeReference对象的实例

pageTypeReference(AnyClassObjectHere.class)

给出一些背景信息。我计划在发出休息请求时通过调用private方法来减少样板代码。所以看起来像以下......

private List<ScanDto> methodMakeScanRequest{
  List<ScanDto> = restTemplate.exchange("/localhost/scans-url",HttpMethod.GET, pageTypeReference(ScanDto.class)).getBody()
}
  

...更新

     

我的尝试看起来像这样。这种作品。但是它现在只是映射到通用链表。对象类型被忽略。

private <T> ParameterizedTypeReference<RestResponsePage<T>> pageTypeReference(Class<T> clazz) {
    return new ParameterizedTypeReference<RestResponsePage<T>>(){};
}

2 个答案:

答案 0 :(得分:1)

请注意clazzName是变量,而不是类型。这意味着您不能将其用作模板参数。例如,由于您要将ScanDto.class传递给它,因此您应将其声明为Class<T>,而不仅仅是T。您可以使用反射创建类型为T的实例。

答案 1 :(得分:0)

您的私有方法在语法上是不正确的 - 方法名称是什么?( restResponseParampageTypeReference ),预期的返回类型是什么?( {{ 1}}或T )。现在,我假设您知道这些问题的答案,但最后却出现了语法错误的代码。所以,我已经编写了一个并行示例来说明您可能想要实现的目标(我的理解 - ParameterizedTypeReference<RestResponsePage<T>> 返回ParameterizedTypeReference<RestResponsePage<T>>实例)可以这样做。< / p>

T

Demo here.

你真的不需要Class来创建一个实例,除非你想直接用T做一些反思。