这是我的代码,请不要给我任务的解决方案。有没有人能告诉我编译错误的原因?以及它到底为什么不起作用。我以前写过这样的代码...
简单的代码:
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);
}
}发布于 2015-03-31 14:32:51
您正在尝试从静态类中访问非静态类。
只需在比较器类定义之前添加static关键字,如下所示:
static class IdComparator implements Comparator<Student>或使用Sort的实例,如:
new Sort().new IdComparator();也要避免使用return o1.getId() - o2.getId();,因为它可能会导致下溢。使用
return Integer.compare(o1.getId(), o2.getId());发布于 2015-03-31 14:41:16
您已经使IdComparator成为了一个内部类。
public class Sort{
class IdComparator implements Comparator<Student> {
...
}
...
}由于您没有将static放在IdComparator上,这意味着IdComparator的每个实例都属于Sort的某个实例。IdComparator实例将具有一个隐藏引用,该引用引用包含该实例的Sort对象。因此,您只能通过指定Sort对象来包含它的方式来使用new IdComparator。如果x是一个Sort,你可以说
x.new IdComparator()或者,如果您在Sort的非静态方法中,您会说
new IdComparator()由于该方法是非静态的,因此它将对特定的Sort对象进行操作,并且new将使用与包含新IdComparator的对象相同的对象。
但是由于您是在静态方法中调用它的,所以没有Sort对象来包含它。这就是你得到一个错误的原因。
您可能不希望IdComparator对象属于特定的Sort对象,因为您不需要引用任何Sort实例字段。在IdComparator的声明中添加static使其成为嵌套类,而不是内部类。
public class Sort{
static class IdComparator implements Comparator<Student> {
...
}
...
}发布于 2015-03-31 14:43:53
因为IdComparator类是一个动态内部类,就像实例的普通字段一样,而main方法是静态的,所以不能使用静态方法直接调用内部类实例。
https://stackoverflow.com/questions/29362053
复制相似问题