不兼容的泛型类型

3

我定义了Jackson序列化器并将其作为JsonDeserialize添加到Java类中,如下所示:

@JsonDeserialize(using = ReportFilterDeserializer.class)

编译器报错如下:
error: incompatible types: Class<ReportFilterDeserializer> cannot be converted to Class<? extends JsonDeserializer<?>>
@JsonDeserialize(using = ReportFilterDeserializer.class)

注释的定义是:
public Class<? extends JsonDeserializer<?>> using() default JsonDeserializer.None.class;

如果我从ReportFilterDeserializer中删除通用属性,它就可以通过编译。我不明白为什么编译器会抱怨。
class ReportFilterDeserializer<T> extends JsonDeserializer<ReportFilter<T>> {
    @Override
    public ReportFilter<T> deserialize(JsonParser jsonParser,DeserializationContext arg1) throws IOException,JsonProcessingException {
        return null;
    }
}

这个序列化对象的声明代码是什么样子的? - MaxZoom
你打算如何实现“反序列化”?你如何确定JSON中的“T”? - Sotirios Delimanolis
你可以看一下这个链接: https://dev59.com/LGMl5IYBdhLWcg3w96-L以下是我的实现方式。这个问题是关于泛型的,所以我们暂时放置 JSON 的问题。 - user1236097
@MaxZoom,声明在问题中 - 查看使用def: - user1236097
1个回答

1

这似乎非常奇怪。我能想到的唯一可能是意外混合了Jackson 1.x和2.x的注解和类(org.codehaus.jackson是1.x,com.fasterxml.jackson是2.x)。

不同的JDK上行为是否有所不同(例如7与8 -- 也许Java 8有问题?)


这是Java 8的代码,我试图将其拆分到不同的类中,但没有成功:@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface Test { public Class<? extends JsonDeserializer<?>> using() default JsonDeserializer.None.class; } - user1236097
我只能说这看起来更像是Java 8的一个bug,而不是Jackson的问题。 :-( - StaxMan
特别是因为该代码在Java 7上编译正常。 - StaxMan
说句题外话,看起来可以解决Jackson 2.6的问题(请参阅https://github.com/FasterXML/jackson-databind/issues/812),但不幸的是无法为旧版本进行签名更改。我认为`javac`在这里有误,但解决方法确实是避免使用通用的反序列化程序/序列化程序:您需要使用具体类型,如果必要,可以通过简单的子类化来实现。 - StaxMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接