[英]Java Generic Map not converted to proper type in runtime for Json converstion
我有一种方法可以在使用实际类时正常工作,但在使用泛型时却无法提供预期的输出。
下面是使用ABC类时可以正常工作的方法
public static List<ABC> getMemberViewRepresentation(Response response) throws JSONException, IOException {
JSONObject jsonObj = new JSONObject(response.readEntity(String.class));
ObjectMapper mapper = new ObjectMapper();
JSONObject memberViewObj = (JSONObject)jsonObj.get("members");
TypeReference<HashMap<String, ABC>> typeRef = new TypeReference<HashMap<String, ABC>>() {};
Map<String, ABC> map = mapper.readValue(memberViewObj.toString(), typeRef);
return new ArrayList<>(map.values());
}
此方法将给出具有ABC类型列表的正确输出。
但是我想编写代码,以便我动态地传递类,以便任何人都可以使用此方法。 所以我写了下面的代码,我也尝试了其他方法,但是它们似乎都不起作用。
public static<T> List<T> getMemberViewRepresentation(Response response) throws JSONException, IOException {
JSONObject jsonObj = new JSONObject(response.readEntity(String.class));
ObjectMapper mapper = new ObjectMapper();
JSONObject memberViewObj = (JSONObject)jsonObj.get("members");
TypeReference<HashMap<String, T>> typeRef = new TypeReference<HashMap<String, T>>() {};
Map<String, T> map = mapper.readValue(memberViewObj.toString(), typeRef);
return new ArrayList<>(map.values());
}
I am calling in this way
List<ABC> nodes = ResponseUtil.getMemberViewRepresentation(response);
但是以上方法的输出是不一样的。 清单不是ABC类型
@JsonIgnoreProperties(ignoreUnknown = true)
public class ABC {
@JsonProperty("id")
private int id;
@JsonProperty("uid")
private String uid;
public int getId() {
return id;
}
public String getUid() {
return uid;
}
}
任何想法如何使方法保持动态,以便我可以分别传递类详细信息
我认为,您需要的是:
List<ABC> nodes = ResponseUtil.<ABC>getMemberViewRepresentation(response);
...以将通用参数推断为静态方法(没有输入参数)。
注意方法调用之前的额外<ABC>
! 通常,您不需要它,因为常规的通用方法类似于: public static<T> void foo(T someInput) {...}
...并提供someInput
, T
是已知的/易于在运行时推断。 在您的情况下, Response
与ABC
无关...因此无法推断(与?
无关)。
第一种方法可以正常工作,因为没有“泛型方法”,而“类泛型类型”似乎可以正确推断(在代码/配置中的其他地方)。
第二个没有,因为缺少“通用方法类型”(我假设分别推断为<?>
<java.lang.Object>
...因此您得到一个返回的List<Object>
并分配给您的List<ABC>
,这不是预期的,但至少是“无故障”)。
您可以争论,我们可以从返回类型“推断” ABC
(您希望获得List<ABC>
,其中交付了List<T>
),但是不幸的是 , 这不是它的工作方式 /该信息尚不可用点/需要更深入的研究。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.