我有Oracle-Java版本1.8.0_171
我的代码:
public void test() {
run(x -> "1"); // calls run(Function)
run(x -> System.out.println("test")); // fails to compile
run(() -> System.out.println("test")); // calls run(Runnable)
run(() -> "1"); // calls run(Supplier)
}
void run(Consumer<Integer> c) {
System.out.println("Consumer");
}
void run(Function<Integer, String> f) {
System.out.println("Function");
}
void run(Supplier<String> s) {
System.out.println("Supplier");
}
void run(Runnable r) {
System.out.println("Runnable");
}
编译器应该能够识别出void不符合String
然而,即使使用javac,它也无法编译test()
的第二行,我得到:
both method run(Consumer<Integer>) in Test and method
run(Function<Integer,String>) in Test match
test()
的第一行和最后两行编译正常,即使它应该是同一个问题。
这是什么问题?我希望我的库用户能够将任何lambda(Function,Consumer,Supplier,Runnable)传递给run方法,而不必使用“丑陋”的语法。