Несоответствие аргумента при использовании ссылки на метод - PullRequest
0 голосов
/ 19 декабря 2018

Ошибка:

EmpDemo.java: 86: ошибка: не найден подходящий метод для сортировки (ArrayList, EmpDemo :: c [...] BySal)Collections.sort (emp, EmpDemo :: compareBySal);^ метод Collections.sort (List) не применим (не может выводить переменные типа) T # 1 (фактические и формальные списки аргументов различаются по длине)) метод Collections.sort (List, Comparator) не применим (не может выводить типпеременные (ы) T # 2 (несоответствие аргумента; недопустимая ссылка на метод не может найти символ символа: метод compareBySal (T # 2, T # 2) location: класс EmpDemo)) где T # 1, T # 2 - переменные типа:T # 1 extends Comparable, объявленный в методе sort (List) T # 2 extends Объект, объявленный в методе sort (List, Comparator) 1 ошибка


public class EmpDemo {

    int compareBySal(Employee e1,Employee e2) {
        return (int) (e1.getSal()-e2.getSal());
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        ArrayList<Employee> emp=new ArrayList<Employee>();

        //Adding employees
        for(int i=1;i<3;i++)
        {

            System.out.println("----Enter the  " +i +"TH Data------");
            System.out.println("Enter your salary");
            float sal=sc.nextFloat();

            Employee e=new Employee();
            e.setSal(sal);

            emp.add(e);
            System.out.println();

        }

        //displaying the employees
        System.out.println("Before Sorting.....");
        System.out.println(emp);

        //**Using METHOD REFERENCE**
        Collections.sort(emp, EmpDemo::compareBySal);

        System.out.println("Before Sorting.....");
        System.out.println(emp);
    }
}

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Сделать compareBySal static, чтобы он соответствовал требуемому функциональному интерфейсу:

static int compareBySal(Employee e1,Employee e2) 
{
    return (int) (e1.getSal()-e2.getSal());
}

или

static int compareBySal(Employee e1,Employee e2) 
{
    return Float.compare(e1.getSal(),e2.getSal());
}

В исходной реализации, где compareBySal - этоДля метода экземпляра EmpDemo::compareBySal требуется 3 аргумента - экземпляр EmpDemo и два экземпляра Employee.Это не соответствует интерфейсу Comparator<Employee>, ожидаемому Collections.sort().

Другая альтернатива (если вы не измените compareBySal на static метод) - это использовать ссылку на методконкретный экземпляр:

Collections.sort(emp, new EmpDemo()::compareBySal);
0 голосов
/ 19 декабря 2018

Вам не нужен метод compareBySal(), просто сортируйте его так:

Collections.sort(emp, Comparator.comparing(Employee::getSal));

Если getSal() возвращает float (не очевидно из вашего кода), то следующая версияеще быстрее:

Collections.sort(emp, Comparator.comparingDouble(Employee::getSal));
...