非空参数的方法引用?

时间:2013-03-27 19:32:20

标签: java lambda java-8

我正在阅读Java 8 features,我看到他们有方法引用,但我没有看到如何在方法重载时指定哪个方法。有谁知道吗?

2 个答案:

答案 0 :(得分:6)

编译器会将方法签名与功能接口匹配。

Integer foo(){...}

Integer foo(Number x){...}

Supplier<Number>          f1 = this::foo;  // ()->Number, matching the 1st foo

Function<Integer, Number> f2 = this::foo;  // Int->Number, matching the 2nd foo

基本上,f2可以接受Integer并返回Number,编译器可以发现第二个foo()符合要求。

答案 1 :(得分:5)

来自this Lambda FAQ

  

可以在哪里使用lambda表达式?

     
      
  • 方法或构造函数参数,目标类型是其类型   适当的参数。如果方法或构造函数被重载,那么   在lambda之前使用通常的重载决策机制   表达式与目标类型匹配。 (重载解决后,   可能仍有多个匹配方法或构造函数   签名接受相同的不同功能接口   功能描述符。在这种情况下,lambda表达式必须是   转换为其中一个功能接口的类型);

  •   
  • Cast表达式,显式提供目标类型。例如:

  •   
Object o = () -> { System.out.println("hi"); };       // Illegal: could be Runnable or Callable (amongst others)
Object o = (Runnable) () -> { System.out.println("hi"); };    // Legal because disambiguated

所以,如果有不明确的签名,你需要施放它。