需要包含<my reference>的封闭实例


91

包含的封闭实例

下面是代码。positionObj是我要使用的对象,它给了我上面的错误。

目前尚不清楚原因。

package toolBox;
import toolBox.Secretary.positionObj;    

public class PositionManagement {
    public static HashMap<String, Secretary.positionObj> main(String vArg){
        positionObj newPosition=new positionObj();
    }
}

Answers:


129

您正在尝试使用非静态内部positionObj类而没有Secretary其所属的实例。
非静态内部类必须属于其父类的实例

您可能应该更改positionObj为普通类或静态内部类。

或者,您可以编写someSecretary.new positionObj()以创建属于该someSecretary实例的内部类的实例。


同意,但是这个一般性声明还不清楚。您能否提供一个示例或为我指出一个可以更好地解释这一点的地方?谢谢
杰森

是。我在尝试调试时意识到,如果我将我的positionObj设为静态(在其秘书类中),则可以正常工作。我很高兴,现在一切正常,但感谢您的指导。将调查此错误的实际原因。
杰森

2
错误的真正原因是您没有提供父实例。除非您确实需要一个非静态内部类并且您了解它们的工作方式,否则不要使用非静态内部类。c2.com/ppr/wiki/JavaIdioms/NoPublicInnerClasses.html
Slaks 2010年

两种解决方案都可以完美工作[1-使positionObj类静态化,以及2-使用OuterClass.new classObj()]。谢谢
杰森

是。但是,您需要充分了解您的代码库,才能找出正确的代码库。
SLaks

16

首先创建一个外部类的对象。在这种情况下,我认为是“秘书”。然后创建positionObj。像这样,

Secretary x = new Secretary();
Secretary.positionObj y = x.new positionObj();

谢谢!...从1.0版开始,我就使用Java,但我不知道您能做到这一点!
理查德T

0

正确的通用签名将是

public static HashMap<String, positionObj> main(String vArg)

您不需要限定positionObj,因为您已经将其导入。

但是,我很确定主要方法必须符合下面的签名。如果打算将main用作程序的主要方法,请将签名更改为

 public static void main(String[] args) {...}

您可以创建一个单独的静态方法,该方法返回Map并从main调用它。

注意,所有类均应以大写字母positionObj开头,应为PositionObj。


嘿,遗漏了一些代码。对此案表示同意。该类确实返回了一些东西,但是错误在这里,我不清楚为什么。
杰森

@jason,我认为您不能从main返回任何内容。
hvgotcodes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.