我有一个方法,当我使用实际类时工作正常,但在使用泛型时不给出预期的输出.
下面是使用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);
…将泛型参数推断为静态方法(WITHOUT typed parameters(s)).
注意额外的< ABC>在方法调用之前!
通常你不需要它,因为常规的通用方法如下:
公共静态< T> void foo(T someInput){…} …并提供someInput,T在运行时已知/易于推断.在你的情况下,Response与ABC无关……所以无法推断(除了?之外的其他内容).
第一种方法按预期工作,因为没有“泛型方法”,而“类泛型类型”似乎是正确推断的(代码/配置中的其他位置).
第二个没有,因为缺少“泛型方法类型”(我假设分别推断为<?>< java.lang.Object> …所以你得到一个List< Object>返回并分配给你的列表< ABC>,这不是预期的,但至少是“无故障”).
您可以论证,我们可以从返回类型“推断”ABC(您期望列表< ABC>,其中列出< T>已交付),但不幸的是,这不是它的工作方式/此信息在此处不可用要点/需要深入研究.