Java8:以非静态方式引用静态方法

Java 8: method reference to a static method in a non-static way

我正在学习 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 的非静态方法。如果我从非静态方法调用比较方法,我会收到编译器警告:

The method compare(Integer, Integer) from the type TestStream should be accessed in a static way

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

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

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

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

这样就可以正常工作了(虽然有警告)。

当 java-8 设计的功能已更正时,因此访问静态方法(用于方法引用)的唯一方法是通过 class 本身:

YourClass::compare

I know why I get the warning but I don't get why this warning becomes a compilation error if I a method reference. I didn't find anything online either. Can someone explain it to me?

这两种情况都应该是编译错误,但是 Java 的早期版本容忍了它,因为语言的设计者并不了解,现在为了继续兼容已经太晚了改变它。

但是,方法引用是一种新构造的语言语法。当您使用构造 <object instance>::<method name> 时,根据定义,您尝试引用的方法不能是静态方法,因为您通过指定要应用它的对象实例来访问它,这是静态方法做不到。

这次做对了,拒绝了试图通过实例访问静态内容的无效构造,不会破坏任何人可能在某处使用过的语言的任何现有语法,尽管不明智。所以这次他们做对了。不要做无效的事情,编译器应该拒绝它们,在那种情况下它会。

在重载方法的情况下,这也会使参数推断复杂化,一些是静态的,一些是非静态的。但这不会是他们不得不凑合使用的第一个推理地狱。