13

我正在阅读有关Java 8 特性的信息,并且看到它们具有方法引用,但我没有看到在方法重载时如何指定哪个方法。有人知道吗?

4

2 回答 2

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是可以接受 aInteger并返回 aNumber的东西,编译器可以发现 2ndfoo()满足要求。

于 2013-03-27T20:01:38.167 回答
5

这个 Lambda 常见问题解答

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

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

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

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

因此,如果存在模棱两可的签名,则需要强制转换它。

于 2013-03-27T20:03:25.490 回答