no enclosing instance of type… in scope

后端 未结 2 940
后悔当初
后悔当初 2020-12-10 05:52

I investigate java inner classes.

I wrote example:

public class Outer {
    public Outer(int a){}

    public class Inner {
        public Inner(Stri         


        
相关标签:
2条回答
  • 2020-12-10 06:11

    Inner is an inner class. It can only be created when there is an enclosing instance of the class containing the Inner class definition.

    However, you've created a static nested class, Nested, which extends from this class. When you try to invoke the super constructor

    public Nested(String str, Boolean b , Number nm)   { super("2",true);   }
    

    it will fail because the super constructor, for Inner, depends on an instance of Outer, which doesn't exist in the static context of the Nested class. Jon Skeet provides a solution.

    An explanation of the solution appears in the JLS here.

    Superclass constructor invocations may be subdivided:

    • Unqualified superclass constructor invocations begin with the keyword super (possibly prefaced with explicit type arguments).

    • Qualified superclass constructor invocations begin with a Primary expression.

      • They allow a subclass constructor to explicitly specify the newly created object's immediately enclosing instance with respect to the direct superclass (§8.1.3). This may be necessary when the superclass is an inner class.
    0 讨论(0)
  • 2020-12-10 06:16

    As Sotirios has said, your nested (not-inner) class doesn't implicitly have an instance of Outer to effectively provide to the Inner.

    You can get round this, however, by explicitly specifying it before the .super part:

    public Nested(String str, Boolean b, Number nm) { 
        new Outer(10).super("2", true);
    }
    

    Or even accept it as a parameter:

    public Nested(Outer outer) { 
        outer.super("2", true);
    }
    

    However, I would strongly advise you to avoid such convoluted code. I avoid nested classes most of the time, named inner classes almost always, and I can't ever remember using a combination of them like this.

    0 讨论(0)
提交回复
热议问题