我有以下类和一个重载的方法:
import java.util.ArrayList;
import java.util.concurrent.Callable;
public abstract class Test {
public void test1 () {
doStuff (ArrayList::new); // compilation error
}
public void test2 () {
doStuff ( () -> new ArrayList<> ());
}
public abstract void doStuff (Runnable runable);
public abstract void doStuff (Callable<ArrayList<String>> callable);
}
方法test1
会导致编译错误,错误消息为The method doStuff(Runnable) is ambiguous for the type Test
。
我添加了第三个方法test3
,如下所示:
public void test3 () {
doStuff ( () -> {
new ArrayList<> ();
});
}
这里执行的是doStuff(Runnable)
方法,这一点很明显。
但是编译器如何决定在test2
中执行这两个方法中的哪一个呢
为什么我可以使用lambda表达式,但不能使用方法引用?
test2
中的λ表达式使用返回可调用对象的方法,为什么方法引用要尝试使用另一个方法?
在我看来,这像是一个java bug。
编辑:它与ArrayList
和/或它的泛型类型无关。具有Callable<String>
或任何其他对象时,也会出现相同的错误。
提前感谢
迪米特里
https://stackoverflow.com/questions/51710250
复制相似问题