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

Java 必须使用Main类型的封闭实例限定分配(例如x.new A(),其中x是Main的实例),java,Java,如何修复以下错误?我需要快速的帮助 线程“main”java.lang中出现异常。错误:未解析编译 问题: 无法访问Main类型的封闭实例。必须使用Main类型的封闭实例限定分配(例如x.new A() 其中x是Main的一个实例) 位于com.common.Main.Main(Main.java:16) 这是我的代码供参考。如果我们解决了这个问题,那么“John”应该只打印一次,而不是两次我们如何限制“John”只打印一次 public class Main { public stat

如何修复以下错误?我需要快速的帮助

线程“main”java.lang中出现异常。错误:未解析编译 问题: 无法访问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;
        }
    }
}
公共类主{
公共静态void main(字符串[]args){
Set l=新的HashSet();
l、 添加(新人员(“约翰”);
l、 添加(新人员(“约翰”);
l、 添加(新人员(“马特”);
l、 添加(新人员(“Deepak”);
l、 添加(新人员(“克里斯”);
for(迭代器迭代器=l.Iterator();迭代器.hasNext();){
Person=(Person)迭代器.next();
System.out.println(person.getName());
}
}
公共阶层人士{
私有字符串名称;
公众人物(字符串名称){
超级();
这个.setName(name);
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
}

由于您的
Person
类看起来不应该是内部类(即,它看起来不需要封闭的
Main
类的关联实例),因此将其设置为静态(即
Main
类的嵌套类,不需要封闭实例):

或者将其移到您的
Main
类之外

编辑:

至于第二个问题,在
Person
类中重写
equals
hashCode
,以便让
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();
}

由于您的
Person
类看起来不应该是内部类(即,它看起来不需要封闭的
Main
类的关联实例),因此将其设置为静态(即
Main
类的嵌套类,不需要封闭实例):

或者将其移到您的
Main
类之外

编辑:

至于第二个问题,在
Person
类中重写
equals
hashCode
,以便让
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();
}

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

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

谢谢。虽然我使用set,但为什么John要打印两次?我只想打印一次。我该换什么。目前我得到的输出是Chris John MattDeepak@user4567570那是另一个问题。为了使您的
HashSet
按您的意愿运行,您必须在
Person
类中重写
equals
hashCode
,以便具有相同名称的两个
Person
实例将彼此相等并具有相同的
hashCode
。谢谢。虽然我使用set,但为什么John要打印两次?我只想打印一次。我该换什么。目前我得到的输出是Chris John MattDeepak@user4567570那是另一个问题。为了使
HashSet
按您的意愿运行,您必须在
Person
类中重写
equals
hashCode
,以便具有相同名称的两个
Person
实例将彼此相等,并且具有相同的
hashCode
。可能重复的