无法实现类似的界面

时间:2014-10-16 01:39:19

标签: java

我一直收到错误:学生不是抽象的,并且不会覆盖java.lang.Comparable中的抽象方法compareTo(java.lang.Object)

这是为什么?这要做的是取一份学生名单并按照GPA进行比较。

public class Student implements Comparable
    {
        private String name;
        private double gpa;    
        public Student(String name, double gpa)
        {
            this.name = name;
            this.gpa = gpa;
        }    
        public String getName()
        {
            return name;
        }
        public double getGpa()
        {
            return gpa;
        }    
        public String toString()
        {
            return "Name: " + name + "  GPA: " + gpa;
        }
        public double compareTo(Object other)
        {
            Student filler = (Student)other;
            if(this.getGpa() < filler.getGpa())
                return -1;
            else if(this.getGpa() == filler.getGpa())
                return 0;
            else
                return 1;
        }    
    }

3 个答案:

答案 0 :(得分:0)

public double compareTo(Object other)

应该是

@Override
public int compareTo(T other)

查看Comparable界面。它需要一个名为compareTo的方法,它采用类型T(通用参数)的参数,返回int 。您创建的方法没有实现接口中指定的方法,这就是Java编译器抱怨的原因。

由于Comparable接口是通用化的,因此您应该利用泛型并使您的类实现Comparable<Student>。当您这样做时,compareTo的签名变为:

@Override
public int compareTo(Student other)

哪个比原始Object更好,因为您不必进行投射,更重要的是,您不会意外地传递非Student的内容。

还有一件事:从接口实现方法时使用@Override注释。假设您正在使用一个中等体面的IDE,如果您有:

,您会看到错误
@Override
public double compareTo(Object other)

由于界面中没有带有该签名的方法。

答案 1 :(得分:0)

要直接回答您的问题,您需要将compareTo()的返回类型从double更改为int

您还应该进行一些其他修改来改进代码:

  1. 实施Comparable<Student>而非Comparable。这使得您可以编写public int compareTo(Student other),并且只允许使用其他compareTo()引用来调用Student

  2. @OverridetoString()之前添加compareTo()注释。此注释可帮助您避免编译器无法捕获的一些常见错误。

答案 2 :(得分:0)

compareTo方法返回int而不是double

同样使用Override注释有助于确保正确覆盖该方法。所以改变这个

public double compareTo(Object other)

@Override
public int compareTo(Object other)