Java 8:以非静态方式引用静态方法的方法

时间:2018-06-15 09:25:49

标签: java java-8 static method-reference

我正在为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)

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

我知道为什么我会收到警告但是如果我使用方法参考,我不知道为什么这个警告会成为编译错误。我也没有在网上找到任何东西。有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:12)

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

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

这样就可以了(虽然有警告)。

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

YourClass::compare

答案 1 :(得分:6)

  

我知道为什么我会收到警告,但我不明白为什么会出现此警告   如果我是方法引用,则编译错误。我没找到任何东西   在线也是。有人可以向我解释一下吗?

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

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

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

在重载方法的情况下,它也会使参数推断变得复杂,一些是静态的,一些是非静态的。但它不会成为他们必须做的第一个推断。