首页 > 解决方案 > Java 8:以非静态方式对静态方法的方法引用

问题描述

我正在为 OCP 考试研究新的 Stream API,我发现了一些我不太了解的东西。这是我的代码:

void methodOne() {
    this.compare(1, 2); // This works fine.
    Stream.of(1,2,3)
        .sorted(this::compare); // Compilation error.
}

static Integer compare(Integer s1, Integer s2) {
    return 0;
}

在这里,我有一个名为 compare 的静态方法和一个名为 compare 的非静态方法。如果我从非静态方法调用 compare 方法,我会收到编译器警告:

TestStream 类型的方法 compare(Integer, Integer) 应该以静态方式访问

如果我改为在流中使用对同一方法的方法引用,则该编译器警告将变成带有相同消息的编译器错误。

我知道为什么会收到警告,但如果我使用方法引用,我不明白为什么此警告会变成编译错误。我也没有在网上找到任何东西。有人可以向我解释吗?

标签: javajava-8staticmethod-reference

解决方案


迄今为止,通过引用访问静态方法被视为设计错误 AFAIK。你甚至可以这样做:

YourClass c = null;
c.compare (...)

这样就可以了(尽管有警告)。

当设计的 java-8 特性得到纠正时,访问静态方法(用于方法引用)的唯一方法是通过类本身:

YourClass::compare

推荐阅读