我有一个跑步者类,它以重载方式接受Runnables或Callables。
class MyController {
public void run(Runnable command) {
}
public void run(Callable command) {
}
}
需要执行run方法的其他类
controllerInstance.run(() -> {...});
基于lambda表达式的代码如何确定调用run(Runnable)或run(Callable)?有没有办法改变这种默认行为?
答案 0 :(得分:2)
假设您指的是java.lang.Runnable
和java.util.concurrent.Callable
,如果您返回一个值,它会匹配Callable
,如果它没有返回值,则匹配{{1}因此,不需要额外的资格。
Runnable
但是,如果需要,您可以通过强制转换强制解决问题。
controllerInstance.run(() -> { /*no return*/ }); // calls run(Runnable command)
controllerInstance.run(() -> { return null; }); // calls run(Callable command)
答案 1 :(得分:1)
方法签名决定了您需要哪种类型的lambda。
因此,当返回void
时,lambda方法与Runnable
接口匹配。
返回Object时,lambda方法与Callable
接口匹配。
import java.util.concurrent.Callable;
class MyController {
public void run(Runnable command) {
System.out.println("Runnable");
}
public void run(Callable command) {
System.out.println("Callable");
}
public static void main(String [] args) {
MyController myController = new MyController();
myController.run(() -> { return "String"; } );
myController.run(() -> {});
}
}
返回:
Callable
Runnable
答案 2 :(得分:1)
您可以使用转换表达式'标记'lambda,这将指示它应该实现哪些接口。例如:
controllerInstance.run((Runnable) () -> {...});
请注意,Callable
实际上有一个返回值,而Runnable
则没有,哪个方法解析会考虑到。我发现只要lambda体的块或表达式返回一个值,就会使用Callable
重载。如果调用确实不明确,则会出现错误,并且可以使用显式转换。