Ошибка компиляции Java с методом сортировки - PullRequest
0 голосов
/ 05 августа 2011

Я сталкиваюсь с этой ошибкой: не удается найти символ - метод сортировки (java.util.ArrayList)

Я пытаюсь отсортировать ArrayList и распечатать его.

Вот код, я также переопределяю методы сравнения в классах HockeyPlayer, Professor, Parent и GasStation. Благодарю. P

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collections;
/**
 * Class Employees.
 */
public class Employees
{
    private ArrayList<Employee> employeeList;

    /**
     * Constructor for objects of class Employees
     */
    public Employees()
    {
        employeeList = new ArrayList<Employee>();
        //Creating 5 each types of Employees
        employeeList.add(new HockeyPlayer("Wayne Gretzky", 894));
        employeeList.add(new HockeyPlayer("Who Ever", 0));
        employeeList.add(new HockeyPlayer("Brent Gretzky", 1));
        employeeList.add(new HockeyPlayer("Pavel Bure", 437));
        employeeList.add(new HockeyPlayer("Jason Harrison", 0));

        employeeList.add(new Professor("Albert Einstein", "Physics"));
        employeeList.add(new Professor("Jason Harrison", "Computer Systems"));
        employeeList.add(new Professor("Richard Feynman", "Physics"));
        employeeList.add(new Professor("BCIT Instructor", "Computer Systems"));
        employeeList.add(new Professor("Kurt Godel", "Logic"));

        employeeList.add(new Parent("Tiger Woods", 1));
        employeeList.add(new Parent("Super Mom", 168));
        employeeList.add(new Parent("Lazy Larry", 20));
        employeeList.add(new Parent("Ex Hausted", 168));
        employeeList.add(new Parent("Super Dad", 167));

        employeeList.add(new GasStation("Joe Smith", 10));
        employeeList.add(new GasStation("Tony Baloney", 100));
        employeeList.add(new GasStation("Benjamin Franklin", 100));
        employeeList.add(new GasStation("Mary Fairy", 101));
        employeeList.add(new GasStation("Bee See", 1));
    }

    /**
     * Display the list of employee
     */
    public void displayEmployees()
    {
        Iterator <Employee> it = employeeList.iterator();
        while(it.hasNext()) {
            Employee e = it.next();
            System.out.println(e);

        }
    }
    /**
     * Display the list of employee sorted
     */
    public void displaySortedEmployees()
    {
        **Collections.sort(employeeList);**
        Iterator <Employee> it = employeeList.iterator();
        while(it.hasNext()) {
            Employee e = it.next();
            System.out.println(e);

        }
    }
}

Я добавил: реализует сравнимый с классом Employee, и теперь он компилируется, но мне нужно сравнить различные подклассы: HockeyPlayer, Parent и on .... При вызове метода это новое сообщение об ошибке: java.lang.ClassCastException, профессор не может быть приведен к HockeyPlayer

Вот один из подклассов:

/**
 * Class HockeyPlayer.
 */
public class HockeyPlayer extends Employee implements Employable, Comparable<Employee>
{
    private       int     numberOfGoals;
    private       double  overTimePayRate ;

    /**
     * Constructor for objects of class Hockeyplayer
     */
    public HockeyPlayer(String name, int numberOfGoals)
    {
        super(name);
        overTimePayRate = 0.0;
        this.numberOfGoals = numberOfGoals;
    }

    /**
     * @return     overTimePayRate 
     */
    @Override
    public double getOverTimePayRate()
    {
        return overTimePayRate;
    }
    @Override
    public String   getDressCode()
    {
        return "jersey";
    }
    @Override
    public boolean  isPaidSalary()
    {
        return true;
    }
    @Override
    public boolean  postSecondaryEducationRequired()
    {
        return false;
    }
    @Override
    public String   getWorkVerb()
    {
        return "play";
    }
    @Override
    public boolean equals(Object that)
    {
        if(this == that){
            return true;
        }
        if(!(this instanceof HockeyPlayer)) {
            return false;
        }
        HockeyPlayer h = (HockeyPlayer) that;
        if(this.numberOfGoals == h.numberOfGoals) {
            return true;
        }
        return false;
    }
    @Override
    public int compareTo(Employee that)
    {
        if(this == that) {
            return 0;
        }

        HockeyPlayer h = (HockeyPlayer) that;

        if(this.numberOfGoals > h.numberOfGoals) {
            return +1;
        }
        else {
            return -1;
        }
    }
}

Ответы [ 3 ]

7 голосов
/ 05 августа 2011

My думаю, означает, что вы не заявили, что Employee реализует Comparable<Employee>, поэтому public static <T extends Comparable<? super T>> void sort(List<T> list) не применимо ... но трудно сказать, поскольку вы не задали свойEmployee class.

Это, безусловно, сообщение об ошибке, которое я получаю, когда пробую ваш код с:

class Employee {}

, но оно компилируется, когда я использую:

class Employee implements Comparable<Employee> {

    // Obviously incorrect implementation, only used for demonstrating
    // that the code will now compile.
    public int compareTo(Employee other) {
        return 0;
    }
}

Предполагая, что различные другие классы являются подклассами Employee, вам необходимо выяснить, как вы сравниваете (скажем) a HockeyPlayer и Parent.Не забывайте, что любой сотрудник должен быть сопоставим с любым другим сотрудником.По моему опыту наследование и сравнение (для равенства или сортировки) редко работают чисто ...

Если вы можете опубликовать короткую, но завершенную программу, демонстрирующую проблему, это действительно поможет.

1 голос
/ 05 августа 2011

Ваш класс Employee должен реализовывать интерфейс Comparable<Employee>, а не только все дочерние классы должны реализовывать метод compareTo (Employee).

0 голосов
/ 05 августа 2011

Я предполагаю, что ypu объявил, что Employee реализует сравнимый результат, поскольку вы использовали аннотацию @Override. Кроме того, если бы вы этого не сделали, то вы получите ошибку времени компиляции, а не ошибку времени выполнения. Я немного смущен, потому что в заголовке вашего вопроса написана ошибка компиляции, но в тексте написано, что вы получили исключение. Даже если ваш класс сотрудника реализует сопоставимый, если ваши подклассы переопределяют реализацию compareTo (), у вас могут возникнуть проблемы, если вы не будете осторожны. Когда метод sort вызывает метод CompareTo () ваших hockeyPlayers с параметром non-hockeyPlayer, вы получаете исключение приведения, которое вы испытываете. Я подозреваю, что если вы отбросите аннотацию @Override и измените подпись на «public int compareTo (HockeyPlayer that)», то это будет работать, потому что она будет использовать унаследованный compareTo () при сравнении с сотрудниками не-hockeyPlayer, а другая - сравнивая с хоккейными игроками. Даже если hockeyPlayer является Сотрудником, Java будет использовать наиболее специфичный из перегруженных методов, если применимо несколько перегруженных методов. Короче говоря, я думаю, вы хотите перегрузить здесь, а не переопределять.

Кроме того, не то, что вы спросили, но я подумал, что стоит спросить:

if(this == that){
            return true;
        }

Вы действительно хотите использовать == здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...