Java中泛型的问题
我正在为api调用使用RestAssured framework,我想创建一个方法,该方法将从特定变量类型的JSON响应返回give me value。Java中泛型的问题,java,generics,rest-assured-jsonpath,Java,Generics,Rest Assured Jsonpath,我正在为api调用使用RestAssured framework,我想创建一个方法,该方法将从特定变量类型的JSON响应返回give me value。 我想使用泛型返回类型,但我不喜欢我的实现。 RestAssured getList()根据JSON路径返回值列表,并转换为值类型。 当我实现getList()方法时,我必须将结果强制转换为T,以符合返回值类型: public <T> T getValuesFromResponse(Response response, ValueTy
我想使用泛型返回类型,但我不喜欢我的实现。
RestAssured getList()根据JSON路径返回值列表,并转换为值类型。 当我实现getList()方法时,我必须将结果强制转换为T,以符合返回值类型:
public <T> T getValuesFromResponse(Response response, ValueTypeEnum value) {
T t = null;
switch (value) {
case ID:
//Will return List<Integer>
t = (T) response.thenReturn().jsonPath().getList("data.id", Integer.class);
break;
case NAME:
//Will return List<String>
t = (T) response.thenReturn().jsonPath().getList("data.name", String.class);
break;
}
return t;
}
公共T getValuesFromResponse(响应响应,ValueTypeEnum值){
T=零;
开关(值){
案件编号:
//将返回列表
t=(t)response.thenReturn().jsonPath().getList(“data.id”,Integer.class);
打破
案例名称:
//将返回列表
t=(t)response.thenReturn().jsonPath().getList(“data.name”,String.class);
打破
}
返回t;
}
当我想调用此方法时,我必须将值再次转换为我需要的类型,即:
((List<Integer>) getValuesFromResponse(response, ValueTypeEnum.ID)).get(0)
((列表)getValuesFromResponse(响应,ValueTypeEnum.ID)).get(0)
如何避免双重施法?使用generic
List
返回类型时,我的实现是否正确?您对使用这样的方法有何看法:
public <T> List<T> getValuesFromResponse(Response response, String key, Class <T> clazz) {
return response.thenReturn().jsonPath().getList(key, clazz);
}
public List getValuesFromResponse(响应、字符串键、类clazz){
返回response.thenReturn().jsonPath().getList(key,clazz);
}
。。。然后称之为:
List<Integer> listOfIds = getValuesFromResponse (response, "data.id", Integer.class);
List<String> listOfNames = getValuesFromResponse (response, "data.name", String.class);
List listOfIds=getValuesFromResponse(响应,“data.id”,Integer.class);
List listOfNames=getValuesFromResponse(响应,“data.name”,String.class);
我还没有尝试过用真正的“Response”类编译它,但我认为这应该是可行的。请让我知道 您觉得使用这样的方法怎么样:
public <T> List<T> getValuesFromResponse(Response response, String key, Class <T> clazz) {
return response.thenReturn().jsonPath().getList(key, clazz);
}
public List getValuesFromResponse(响应、字符串键、类clazz){
返回response.thenReturn().jsonPath().getList(key,clazz);
}
。。。然后称之为:
List<Integer> listOfIds = getValuesFromResponse (response, "data.id", Integer.class);
List<String> listOfNames = getValuesFromResponse (response, "data.name", String.class);
List listOfIds=getValuesFromResponse(响应,“data.id”,Integer.class);
List listOfNames=getValuesFromResponse(响应,“data.name”,String.class);
我还没有尝试过用真正的“Response”类编译它,但我认为这应该是可行的。请让我知道 我试过了,但是没有编译<代码>公共列表getValuesFromResponse(Response-Response,DeviceValues-value){return-Response.thenReturn().jsonPath().getList(“data.id”,Integer.class);}错误是:不兼容的相等约束:T和IntegerI尝试了该操作,但未编译<代码>公共列表getValuesFromResponse(Response-Response,DeviceValues-value){return-Response.thenReturn().jsonPath().getList(“data.id”,Integer.class);}错误是:不兼容的等式约束:T和Integer这起作用,但它需要“用户”定义返回类类型,而我希望它更通用。奇怪的是,如果我使用它编译的Integer.class定义的“clazz”,但是如果我使用的是straight Integer.class,那么如果我理解正确的话,你会想要一个返回特定类的对象列表的方法来避免类型转换。并且只希望传递ValueTypeEnum。此枚举值表示:(1)响应中字段的名称是什么,如:'data.name',(2)列表将包含的类型(对象类),如:'String'。识别ValueTypeEnum的值意味着它是一个运行时处理,而避免类型转换意味着我们知道编译时在特定场景中返回什么类。我不确定这两者是否同时存在。祝你好运。这是可行的,但它需要“用户”定义返回类类型,而我希望它更通用。奇怪的是,如果我使用它编译的Integer.class定义的“clazz”,但是如果我使用的是straight Integer.class,那么如果我理解正确的话,你会想要一个返回特定类的对象列表的方法来避免类型转换。并且只希望传递ValueTypeEnum。此枚举值表示:(1)响应中字段的名称是什么,如:'data.name',(2)列表将包含的类型(对象类),如:'String'。识别ValueTypeEnum的值意味着它是一个运行时处理,而避免类型转换意味着我们知道编译时在特定场景中返回什么类。我不确定这两者是否同时存在。祝你好运