我刚开始学习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");
}
}
任何人都可以帮忙!!
答案 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