java 8 Method :: reference非常令人困惑

时间:2019-03-23 19:09:29

标签: java-8 method-reference

package com.java8;

public class MethodReferenceExample {

    public MethodReferenceExample() {
        System.out.println("MethodReferenceExample.....");
    }

    public int display() {
        System.out.println("in display");
        return 1;
    }

    public static int read() {
        System.out.println("in read");
        return 10;
    }

    public static void main(String[] args) {
        //point 1
        MyInterface myIn = MethodReferenceExample::new;
        myIn.show();

        //point 2
        MyInterface objectReference = new MethodReferenceExample()::display;
        objectReference.show();
        int value = objectReference.show(); //you can't assign this because show is void///

        MyInterface staticReference = MethodReferenceExample::read;
        staticReference.show();


    }

}


interface MyInterface{
    public void show();
    default public int getvalue() {
        return 10;
    }
}

在第1点,我们可以使用:: new分配构造函数引用,但该接口未实现

在第2点,我们可以使用具有返回值为void的show方法来调用将返回值为int的显示方法,并且仍将其调用。这有多奇怪? 2个方法之间没有任何联系,但仍可以调用它,因为它具有相同数量的参数。为什么Java员工会进行此更改?我的意思是,此方法参考确实令人困惑,并且确实没有任何意义,没有正当的理由,那么为什么他们要进行这种令人困惑的更改?

再次在第2点中可以调用它,但是不能将返回值分配给int,因为调用方法是void,所以它不能将void转换为int,为什么会造成所有这些混乱呢?有人可以解释一下吗?我的大脑很难接受所有这些方法参考资料。

谢谢。

1 个答案:

答案 0 :(得分:3)

  

在第2点,我们可以使用具有返回值为void的show方法来调用将返回值为int的显示方法,并且仍将其调用。这有多奇怪?

就像能够调用someList.add(something)并忽略返回的值一样奇怪,就像List.add()的返回类型为void一样。它不是无效的:它是布尔值,但是您并不关心返回值,因此您将其称为好像返回了void一样,而忽略结果。同样在这里。该接口定义了一个无需任何参数即可调用的方法。 display()是这种方法。就这么简单。

  

为什么Java员工会进行此更改?

因为这是一个很好的更改,通常可以使代码更清晰,更高效。

  

此方法参考确实令人困惑,而且毫无意义

这确实很有意义,并且有充分的理由。您尚未了解它们的事实并不会使它们失去用处。