gpt4 book ai didi

Java通用双函数根据指定的类类型返回值

转载 作者:行者123 更新时间:2023-12-02 08:51:47 24 4
gpt4 key购买 nike

我正在尝试编写通用 Json 反序列化器,如下所示,

  public static <T> BiFunction<String, Class<T>, T> jsonDeSerializer() {
return (o, c) -> {
try {
return mapper.readValue(o, c);
} catch (IOException e) {
logger.error("json.parse.error object.type={}", o.getClass().getSimpleName(), e);
throw new JsonProcessingEx(e);
}
};
}

当我尝试打电话时,我收到

error: incompatible types: Class<MLAdhocResponseVO> cannot be converted to Class<Object>
MLAdhocResponseVO response = JsonUtils.jsonDeSerializer().apply("{}", MLAdhocResponseVO.class);

我只想编写一个 BiFunction,它根据提供的类返回对象,而不需要任何类型转换。

最佳答案

当你打电话时

JsonUtils.jsonDeSerializer().apply("{}", MLAdhocResponseVO.class);

jsonDeSerializer() 的泛型类型参数是 Object(thisthis 可以提供更多说明),而不是 MLAdhocResponseVO正如您所期望的那样。

快速修复方法是在调用中添加类型见证,以告诉编译器该方法的预期类型参数是什么:

MLAdhocResponseVO response = JsonUtils.<MLAdhocResponseVO>jsonDeSerializer()
.apply("{}", MLAdhocResponseVO.class);

或者,您可以通过声明类型化 BiFunction 变量来为编译器提供目标类型:

BiFunction<String, Class<MLAdhocResponseVO>, MLAdhocResponseVO> 
function = jsonDeSerializer();
MLAdhocResponseVO response = function.apply("{}", MLAdhocResponseVO.class);
<小时/>

如果您想完全避免这种情况,那么您的方法可能会更好地设计为使用泛型类型的实际参数,这将有助于编译器的类型推断:

public static <T> Function<String, T> jsonDeSerializer(Class<T> c) {
return (o) -> {
try {
return mapper.readValue(o, c);
} catch (IOException e) {
logger.error("json.parse.error object.type={}",
o.getClass().getSimpleName(), e);
throw new JsonProcessingEx();
}
};
}

这样,您的代码就可以编译而无需类型见证:

MLAdhocResponseVO response = JsonUtils.jsonDeSerializer(MLAdhocResponseVO.class)
.apply("{}");

甚至这个独立的表达式也可以正确输入:

JsonUtils.jsonDeSerializer(MLAdhocResponseVO.class)
.apply("{}");

关于Java通用双函数根据指定的类类型返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59959041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com