什么是使用:: instanceMethod作为java8中的方法参数

时间:2016-01-06 10:20:57

标签: java

我刚开始学习java8 stream api。我见过一种方法,它具有输入类型Runnable接口,即使它允许传递this::greet作为参数。当程序运行时,为什么不调用greet方法?它的输出只有Hello, world!2。为什么它允许传递这样的方法,即使输入是runnable接口?

public class TestAnno {

    public static void main(String[] args) {
        TestAnno anno=new TestAnno();
    }
    public TestAnno() {
        display(this::greet); // what is use of calling this method
        display(this.greet()); //compiler error: The method display(Runnable) in the type TestAnno is not applicable for the arguments (void)
    }
    private  void display(Runnable s) {
        System.out.println("Hello, world!2");
        //Arrays.sort(new String[]{"1","2"}, String::compareToIgnoreCase);

    }
    public void greet() {
        System.out.println("Hello, world! greet");

    }
}

我创建了界面来理解它。

public interface Inter1 {
 void hello();
 void hello1(int a);
}

现在我将显示方法参数更改为Inter1而不是Runnable。抛出错误'此表达式的目标类型必须是功能界面'。

喜欢

public class TestAnno {

    public static void main(String[] args) {
        TestAnno anno=new TestAnno();
    }
    public TestAnno() {
        display(this::greet); // The method display(Inter1) in the type TestAnno is not applicable for the arguments (this::greet)
        display(()->this.greet());//The target type of this expression must be a functional interface

    }
    /*private  void display(Runnable s) {
        System.out.println("Hello, world!2");
        Arrays.sort(new String[]{"1","2"}, String::compareToIgnoreCase);

    }*/
    private  void display(Inter1 s){

    }
    public void greet() {
        System.out.println("Hello, world! greet");

    }


}

任何人都可以帮忙!!

1 个答案:

答案 0 :(得分:1)

this::greet指的是没有参数且没有返回值的方法。因此,它匹配Runnable接口的单一方法 - void run()

您的显示方法接受Runnable实例。它必须执行Runnable的{​​{1}}方法才能执行run方法:

greet

如果您将其转换为lambda表达式,则第二次尝试调用private void display(Runnable s) { s.run(); System.out.println("Hello, world!2"); } 可以通过编译:

display