非空参数的方法引用?

2022-09-04 21:55:19

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


答案 1

编译器将方法签名与函数接口匹配。

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

从本质上讲,是可以接受 a 并返回 a 的东西,编译器可以发现 2nd 满足要求。f2IntegerNumberfoo()


答案 2

此 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

因此,如果存在不明确的签名,则需要强制转换它。


推荐