繁体   English   中英

Java通用地图未在运行时转换为Json会话的正确类型

[英]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) {...} ...并提供someInputT是已知的/易于在运行时推断。 在您的情况下, ResponseABC无关...因此无法推断(与?无关)。

第一种方法可以正常工作,因为没有“泛型方法”,而“类泛型类型”似乎可以正确推断(在代码/配置中的其他地方)。

第二个没有,因为缺少“通用方法类型”(我假设分别推断为<?> <java.lang.Object> ...因此您得到一个返回的List<Object>并分配给您的List<ABC> ,这不是预期的,但至少是“无故障”)。

您可以争论,我们可以从返回类型“推断” ABC (您希望获得List<ABC> ,其中交付了List<T> ),但是不幸的这不是它的工作方式 /该信息尚不可用点/需要更深入的研究。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM