【发布时间】:2018-08-06 14:44:08
【问题描述】:
我有以下具有重载方法的类:
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 中的 lambda 表达式使用返回可调用的方法,为什么方法引用尝试使用其他方法?
在我看来,这就像一个 java 错误。
编辑:
它与ArrayList 和/或它的泛型类型无关。当您有 Callable<String> 或任何其他对象时,同样的错误。
提前致谢
迪米特里
【问题讨论】:
-
不要重载方法以在相同的参数位置采用不同的功能接口,因为这会导致混淆。
-
该领域的最新讨论:stackoverflow.com/a/51582052/4611488(引用 Joshua Bloch 的著名引言)。
-
@StephanHerrmann 我认为这与 IMO 的那个问题无关,请参阅我的回答
-
@Eugene 似乎这个当前的问题比我链接的问题更严重,但共同的主题是:如果你遵循约书亚布洛赫的建议。如果您阅读 Gilad 的博文,在使用任何形式的重载之前,您会(至少)三思而后行。
标签: java java-8 compiler-errors overloading method-reference