return 具有通用输入的嵌套对象

return nested object with generic input

我有以下对象初始化。它是 RestfulService class.

的一部分
ParameterizedTypeReference<RestResponsePage<ScheduledScanDto>> ptr =
            new ParameterizedTypeReference<RestResponsePage<ScheduledScanDto>>(){};

它在 class 中多次使用,但参数不同。例如

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

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

它有点罗嗦...我正在尝试为 return ParameterizedTypeReference 对象创建一个私有方法作为私有方法的一部分。这将减少 class 中的样板代码和代码重复。我正在努力处理私有方法的语法,尤其是泛型的嵌套。

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

pageTypeReference(AnyClassObjectHere.class)

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

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

Update...

My attempt looks like this. This kind of works. However it now just maps to a generic linkedlist. The object type is ignored.

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

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

类型的实例

您的私有方法在语法上不正确 - 方法名称是什么?(restResponseParampageTypeReference),预期的是什么 return 类型?(TParameterizedTypeReference<RestResponsePage<T>>)。现在,我假设您知道这些问题的答案,但最终得到的是语法错误的代码。所以,我写了一个平行的例子来展示你可能想要实现的目标(我的理解 - return ParameterizedTypeReference<RestResponsePage<T>> 来自 T 的实例) 可以这样做。

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Ideone ide = new Ideone();
        SampleClass<String> s = ide.getInstance();
        s.printType(String.class);
    }

    private <T> SampleClass<T> getInstance(){
        return new SampleClass<T>(){};
    }

    private static class SampleClass<T>{

        public void printType(Class<T> clazz){
            System.out.println("Type: " + clazz.getSimpleName());
        }
    }
}

Demo here.

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