必须使用Main类型的封闭实例限定分配(例如x.new A(),其中x是Main的实例)

时间:2015-11-21 08:14:14

标签: java

如何解决以下错误?我需要快速帮助。

  

线程中的异常" main" java.lang.Error:未解析的编译   问题:         不能访问类型为Main的封闭实例。必须使用Main类型的封闭实例限定分配(例如x.new A()   其中x是Main的实例。

     

在com.common.Main.main(Main.java:16)

这是我的代码供参考。如果我们解决了这个问题,那么"John"应该只打印一次而不是两次。 我们如何限制"John"打印一次

public class Main {
    public static void main(String[] args) {
        Set<Person> l = new HashSet<Person>();
        l.add(new Person("John"));
        l.add(new Person("John"));
        l.add(new Person("Matt"));
        l.add(new Person("Deepak"));
        l.add(new Person("Chris"));

        for (Iterator iterator = l.iterator(); iterator.hasNext();) {
            Person person = (Person) iterator.next();
            System.out.println(person.getName());
      }
    }

    public class Person{
        private String name;

        public Person(String name) {
            super();
            this.setName(name);
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

由于你的Person类看起来不应该是一个内部类(即它看起来不像需要一个封闭的Main类的关联实例),所以将它设为静态(即Main类的嵌套类,不需要封闭实例):

public static class Person { ...

或将其移至Main课程之外。

编辑:

关于您的第二个问题,请覆盖equals课程中的hashCodePerson,以便让HashSet知道两个对象何时应该被视为相同:

public boolean equals (Object other) {
    if (!(other instanceof Person))
        return false;
    Person op = (Person) other;
    return this.name.equals(op.name);
}

public int hashCode () {
    return name.hashCode();
}

答案 1 :(得分:1)

PersonMain的内部类,因为它不是静态的main无法访问它。