无法覆盖Comparator的compare()方法

7

尽管我已经实现了该方法,但我不确定为什么会出现以下错误。

在实现比较方法时,NameComparator.java中出现“类型NameComparator的compare(Student, Student)方法必须覆盖或实现一个超类型方法”的错误。

Student.java

public class Student {
    private String name;
    private int age;
    private String lesson;
    private int grade;

    public Student() {
    }

    public Student(String name, int age, String lesson, int grade) {
        super();
        this.name = name;
        this.age = age;
        this.lesson = lesson;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getLesson() {
        return lesson;
    }

    public void setLesson(String lesson) {
        this.lesson = lesson;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "[name=" + this.name + ", age=" + this.age + ", lesson="
                + this.lesson + ", grade=" + this.grade + "]";
    }

}

NameComparator.java

import java.util.Comparator;

@SuppressWarnings("rawtypes")
public class NameComparator implements Comparator {

// I’m getting this error for below method "The method compare(Student, Student) of type NameComparator must override or implement a super type method"

    @Override
    public int compare(Student s1, Student s2) {
        String name1 = o1.getName();
        String name2 = o2.getName();

        // ascending order (descending order would be: name2.compareTo(name1))
        return name1.compareTo(name2);
    }

}

1
将“implements”部分更改为“implements Comparator<Student>”。 - user784540
你认为 @SuppressWarnings("rawtypes") 是什么意思?你为什么要添加它? - Boris the Spider
当未对比较器进行参数化时,实现比较器接口会出现“Comparator is a raw type. References to generic type Comparator<T> should be parameterized”警告。因此,为了抑制这个警告,添加了这个。也许这是一种愚蠢的编程 :) #Boris the Spider - Karthik Cherukuri
这正是导致你错误的原因,不是吗?如果你读了错误信息,就会发现你的“比较器”需要一个泛型类型才能按照你想要的方式运行。从中可以得到的教训是要阅读并充分理解编译器警告,而不是忽略它们。 - Boris the Spider
3个回答

8
改变
public class NameComparator implements Comparator {

to

public class NameComparator implements Comparator<Student> {

当您实现原始的Comparator接口(不建议这样做)时,您的compare方法需要Object类型的参数。


4

Comparator<T> 接口是一个泛型接口。默认情况下,它使用了 Comparator<Object> 的默认实现,这意味着它期望实现 public int compare(Object s1, Object s2) { 方法。

要解决这个问题,只需在类声明中将 Comparator 替换为 Comparator<Student> 即可。


人们是否说“Java泛型是不变的”,这意味着如果代码没有明确使用<T>符号,则始终调用Object方法(在Kotlin中为Any?)? - Minh Nghĩa
1
@MinhNghĩa,是的,基本上就是这样。如果期望的是<T>,但没有提供,则使用<Object> - npinti

2
方法声明必须像这样:
@Override
public int compare(Object s1, Object s2) {

因为你没有在 implements 子句中添加通用类型。

将类声明更改为:

public class NameComparator implements Comparator<Student> {

错误将会消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接