如何指导lambda表达式在类

时间:2017-03-17 22:51:30

标签: java lambda

我有一个跑步者类,它以重载方式接受Runnables或Callables。

class MyController {
  public void run(Runnable command) {
  }

  public void run(Callable command) {
  }
}

需要执行run方法的其他类

controllerInstance.run(() -> {...});

基于lambda表达式的代码如何确定调用run(Runnable)或run(Callable)?有没有办法改变这种默认行为?

3 个答案:

答案 0 :(得分:2)

假设您指的是java.lang.Runnablejava.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重载。如果调用确实不明确,则会出现错误,并且可以使用显式转换。