这是我的代码,请不要给我分配的解决方案。任何人都可以在编译错误上启发我吗?为什么它不起作用。我之前写了这样的代码......
简单代码:
Student.java
public class Student
{
private int id;
public Student(int NewId)
{
id = NewId;
}
public int getId(){ return id; }
public void setId(int NewId){ id = NewId; }
}
Sort.java
public class Sort
{
public static Comparator<Student> getStudentIdComparator()
{
return new IdComparator();//<- compile error
}
class IdComparator implements Comparator<Student>
{
@Override
public int compare(Student o1, Student o2)
{
return o1.getId() - o2.getId();
}
}
}
MainFile.java
class MainFile
{
public static void main(String[] args)
{
Student s[] = new Student[10];
// Here you would just create the instance variable with student id in the argument
Comparator<Student> studentIdComparator = Sort.getStudentIdComparator();
Arrays.sort(students, studentIdComparator);
}
}
答案 0 :(得分:3)
您正尝试从静态类中访问非静态类。
只需在比较器类定义之前添加static关键字,如:
static class IdComparator implements Comparator<Student>
或使用Sort的实例:
new Sort().new IdComparator();
同时避免使用return o1.getId() - o2.getId();
,因为它可能会导致下溢。使用
return Integer.compare(o1.getId(), o2.getId());
答案 1 :(得分:0)
您已将IdComparator
作为内部课程。
public class Sort{
class IdComparator implements Comparator<Student> {
...
}
...
}
由于您没有将static
放在IdComparator
上,这意味着IdComparator
的每个实例都属于某个<{1}的实例 }。 Sort
实例将具有隐藏引用,该引用引用包含它的IdComparator
对象。因此,您只能以指定Sort
对象的方式使用new IdComparator
来包含它。如果Sort
是x
,您可以说
Sort
或者如果您使用x.new IdComparator()
的非静态方法,并且您说
Sort
由于该方法是非静态的,因此它将在特定的new IdComparator()
对象上运行,Sort
使用与包含新new
的对象相同的对象。< / p>
但是,由于您是在静态方法中调用它,因此没有IdComparator
对象来包含它。这就是你收到错误的原因。
您可能不希望Sort
个对象属于特定的IdComparator
个对象,因为您不需要引用任何Sort
个实例字段。将Sort
添加到static
的声明中会使其成为嵌套类,而不是内部类。
IdComparator
答案 2 :(得分:0)
因为您的IdComparator类是一个动态内部类,就像您实例的普通字段一样,但是您的main方法是静态的,您不能使用静态方法直接调用内部类实例。