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
.
类型的实例
您的私有方法在语法上不正确 - 方法名称是什么?(restResponseParam
或 pageTypeReference
),预期的是什么 return 类型?(T
或 ParameterizedTypeReference<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());
}
}
}
你真的不需要 Class 创建一个实例,除非你想直接用 T 做一些反射性的事情。
我有以下对象初始化。它是 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
.
您的私有方法在语法上不正确 - 方法名称是什么?(restResponseParam
或 pageTypeReference
),预期的是什么 return 类型?(T
或 ParameterizedTypeReference<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());
}
}
}
你真的不需要 Class 创建一个实例,除非你想直接用 T 做一些反射性的事情。