我正在阅读Java 8 features,我看到他们有方法引用,但我没有看到如何在方法重载时指定哪个方法。有谁知道吗?
答案 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)
可以在哪里使用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
所以,如果有不明确的签名,你需要施放它。