no enclosing instance of type… in scope

牧云@^-^@ 提交于 2019-11-28 10:17:37
Sotirios Delimanolis

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.

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!