有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中使用Comparator时不可编译的源代码

尝试运行此小程序时出现以下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at MainClass.main(Person.java:120)
Caused by: java.lang.RuntimeException: Uncompilable source code - FirstNameComparator is not abstract and does not override abstract method compare(java.lang.Object,java.lang.Object) in java.util.Comparator
    at FirstNameComparator.<clinit>(Person.java:71)
    ... 1 more
Java Result: 1

请告诉我我做错了什么,当然这将有助于一个简短的例子,解释如何正确使用ComparatorComparable

import java.util.*;
import java.lang.*;

public class Person implements Comparable {

    private String firstName;
    private String lastName;
    private int age;

    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName= lastName;
    }

    public String getLastName() {
        return lastName;
    }

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

    @Override
    public int compareTo(Object anotherPerson) throws ClassCastException {
        if(!(anotherPerson instanceof Person)) {
            throw new ClassCastException("A person object expected !");
        }
        int anotherPersonAge = ((Person)anotherPerson).getAge();
        return this.age = anotherPersonAge;
    }

}

LastNameComparator。爪哇

class LastNameComparator implements Comparator  {

    public int compareTo(Object person, Object AnotherPerson)  {
        String lastName1 = ((Person)person).getLastName().toUpperCase();
        String firstName1= ((Person)person).getFirstName().toUpperCase();
        String lastName2 = ((Person)person).getLastName().toUpperCase();
        String firstName2 = ((Person)person).getFirstName().toUpperCase();

        if(lastName1.equals(lastName2)) {
            return firstName1.compareTo(firstName2);

        }else {
           return lastName1.compareTo(lastName2);

        }
    }

    }   

第一名比较器。爪哇

class FirstNameComparator implements Comparator {

    public int compareTo(Object person, Object anotherPerson) {

        String lastName1 = ((Person)person).getLastName().toUpperCase();
        String firstName1 = ((Person)person).getFirstName().toUpperCase();
        String lastName2 = ((Person) person).getLastName().toUpperCase();
        String firstName2 = ((Person) person).getFirstName().toUpperCase();

        if(firstName1.equals(lastName1)) {
            return lastName1.compareTo(lastName2); 

        }else {
            return firstName1.compareTo(firstName2);
        }

    }
}

主课。爪哇

class MainClass  {

    public static void main(String[] args) {

        Person[] persons = new Person[4];
        persons[0] = new Person();
        persons[0].setFirstName("Asaftei");
        persons[0].setLastName("Ionut");
        persons[0].setAge(25);

        persons[1] = new Person();
        persons[1].setFirstName("Binoclu");
        persons[1].setLastName("Telescop");
        persons[1].setAge(10);

        persons[2] = new Person();
        persons[2].setFirstName("Morcov");
        persons[2].setLastName("Castravete");
        persons[2].setAge(33);

        persons[3] = new Person();
        persons[3].setFirstName("Rosie");
        persons[3].setLastName("Ardei");
        persons[3].setAge(55);

        System.out.println("Natural Order : ");
        for(int counter =0; counter<=3; counter++)  {
            Person person = persons[counter];
            String lastName=person.getLastName();
            String firstName=person.getFirstName();
            int age = person.getAge();
            System.out.println(lastName+ ", " +firstName+ " , "+age);
        }

        Arrays.sort(persons, new FirstNameComparator());
        System.out.println();
        System.out.println("Sorted by First Name: ");
        for(int counter=0; counter<=3; counter++) {
            Person person = persons[counter];
            String lastName = person.getLastName();
            String firstName = person.getFirstName();
            int age = person.getAge();

            System.out.println(lastName+ ", " +firstName+ ", " +age );
        }
        Arrays.sort(persons, new LastNameComparator());
        System.out.println();
        System.out.println("Sorted by Last Name");        for(int counter=0; counter<=3; counter++) {
            Person person = persons[counter];
            String lastName = person.getLastName().toUpperCase();
            String firstName = person.getFirstName().toUpperCase();
            int age = person.getAge();
            System.out.println(lastName +", "+firstName+", "+age);
        }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    ^{}需要实现^{}方法,而不是compareTo方法

    因此,例如,您的FirstNameComparator应该如下所示:

    class FirstNameComparator implements Comparator {
    
        @Override
        public int compare(Object person, Object anotherPerson) {
            // implementation
        }
    }
    

    请注意,由于此Comparator用于比较Person实例,因此最好使用泛型语法并将其定义为:

    class FirstNameComparator implements Comparator<Person> {
    
        @Override
        public int compare(Person person, Person anotherPerson) {
            // implementation
        }
    }
    
  2. # 2 楼答案

    别忘了^{}接受generic type arguments。 因此,请使用implements Comparable<Person>。这意味着你可以比较两个人

    此外,不允许重写方法向该方法添加其他抛出。见this question

    新的定义应该是这样的:

    @Override
    public int compareTo(Person other) { 
        return Intger.compare(this.getAge(), other.getAge());
    }