java - 方法引用中的类型推断

标签 java java-8 method-reference

我最近接触了 Java 8 并尝试使用方法引用。 我尝试了不同类型的方法引用并陷入“对特定类型的任意对象的实例方法的引用”类型。

String[] arr = {"First", "Second", "Third", "Fourth"};

Arrays.sort(arr, String::compareToIgnoreCase);

这非常有效。但是当我尝试通过其类型引用用户定义类的方法时:

Demo2[] arr = {a, b};

Arrays.sort(arr, Demo2::compare);

这将编译时错误显示为“无法从静态上下文中引用非静态方法”。

这是 Demo2 类:

public class Demo2 implements Comparator<Demo2> {
    Integer i;

    Demo2(Integer i1){
        i = i1;
    }

    public Integer getI() {
        return i;
    }

    @Override
    public int compare(Demo2 o1, Demo2 o2) {
        return o1.getI().compareTo(o2.getI());
    }
}

最佳答案

正如 greg-449 指出的那样,您的代码有一个错误。

通过像 YourObjet::yourMethod 这样的方法引用,您可以对实例的方法进行static 引用。因此将为每个对象调用该方法,因此签名需要与之前的不同

将编译的代码将具有以下形式:

Demo2[] demos = {a, b};
Arrays.sort(demos, Demo2::compareTo);

public class Demo2 {
    Integer i;

    Demo2(Integer i1){
        i = i1;
    }

    public Integer getI() {
        return i;
    }

    public int compareTo(Demo2 other) {
        return this.getI().compareTo(other.getI());
    }
}

但正如 RealSkeptic 指出的那样,这不是实现和对象比较的正确方法。您应该给 Arrays.sort 方法一个比较器:

 Arrays.sort(demos, (obj1, obj2) -> obj1.getI().compareTo(obj2.getI()));

关于java - 方法引用中的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39073799/

相关文章:

java - 我需要一个通过命令行启动 Slick 2D/LWJGL Java 项目的解决方案。帮助?

java - 如果所有人的工资总额超过...,如何制作职位列表?

java - 如何将 Stream 方法分配给 Java 8 中的函数?

java - 如何将复制构造函数作为方法引用传递?

java-8 - 方法引用。不能对非静态方法进行静态引用

java - 通用返回对象

java - ImageIcon 不显示在 java 中

java - 在 Java 8 中构建 Map 以进行集成测试的重构方法 - 函数式编程的机会?

java - 我正在研究 Robolectric 但出现错误

java - 为什么在 java 接口(interface)中使用 this 关键字,它指的是什么?