编译错误“ Outer.Nested在外部具有私有访问权限”,以嵌套类作为值对外部类进行注释

时间:2019-09-24 08:45:39

标签: java maven java-8 jackson javac

我有一个非常简单的用例,其中将一个助手类(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编译器的这种行为是否有原因?还是仅仅是一个错误?

0 个答案:

没有答案