我有一个非常简单的用例,其中将一个助手类(Jackson自定义序列化程序)作为静态嵌套类放置在主类(JSON模型类)中。令人惊讶的是,它无法编译:
// v-- compile error here
@JsonSerialize(using = Outer.Nested.class)
public class Outer {
// ... private members
private static class Nested extends JsonSerializer<Outer> {
@Override
public void serialize(Outer instance, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
// ... serialization code accessing Outer's private members
}
}
}
编译错误消息是
org.example.Outer.Nested在org.example.Outer中具有私人访问权限
此消息对我来说毫无意义,因为嵌套类允许对外部类的私有访问。
还奇怪的是,编译错误仅在Maven中发生(它使用来自Oracle 1.8.0_201 JDK的javac
)。在Eclipse中,相同的代码可以正常编译和运行。
我找到了解决此问题的多种方法,最好的方法是将嵌套类的可见性从private更改为package-private。这段代码编译:
@JsonSerialize(using = Outer.Nested.class)
public class Outer {
// ... private members
/*package-private*/ static class Nested extends JsonSerializer<Outer> {
@Override
public void serialize(Outer instance, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
// ... serialization code accessing Outer's private members
}
}
}
javac
编译器的这种行为是否有原因?还是仅仅是一个错误?