Java Generic Map在运行时未转换为适当类型以进行Json转换

我有一个方法,当我使用实际类时工作正常,但在使用泛型时不给出预期的输出.

下面是使用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>已交付),但不幸的是,这不是它的工作方式/此信息在此处不可用要点/需要深入研究.

点赞