【问题标题】:Argument mismatch while using method reference使用方法引用时参数不匹配
【发布时间】:2019-05-20 00:08:13
【问题描述】:

错误是:

EmpDemo.java:86: 错误:找不到合适的方法 sort(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) 位置:类 EmpDemo)) 其中 T#1,T#2 是类型变量: T#1 扩展了方法 sort(List) 中声明的 Comparable T#2 扩展了方法 sort(List,Comparator) 中声明的 Object 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);
    }
}

【问题讨论】:

    标签: java sorting lambda java-8 method-reference


    【解决方案1】:

    您不需要compareBySal() 方法,只需像这样排序:

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

    如果getSal() 返回float(从您的代码中不明显),那么以下版本甚至更快:

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

    【讨论】:

    • emp.sort(Comparator.comparing(Employee::getSal));。顺便说一句,该属性似乎是 float 值,因此您必须在专用变体中使用 comparingDouble
    【解决方案2】:

    使compareBySalstatic匹配所需的功能接口:

    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 实例。这与Collections.sort() 所期望的Comparator&lt;Employee&gt; 接口不匹配。

    另一种选择(如果您不将 compareBySal 更改为 static 方法)是使用特定实例的方法引用:

    Collections.sort(emp, new EmpDemo()::compareBySal);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多