Java 非空参数的方法引用?
我正在阅读关于的,我看到它们有方法引用,但我没有看到如何在方法重载时指定哪个方法。有人知道吗?编译器会将方法签名与函数接口匹配Java 非空参数的方法引用?,java,lambda,java-8,Java,Lambda,Java 8,我正在阅读关于的,我看到它们有方法引用,但我没有看到如何在方法重载时指定哪个方法。有人知道吗?编译器会将方法签名与函数接口匹配 Integer foo(){...} Integer foo(Number x){...} Supplier<Number> f1 = this::foo; // ()->Number, matching the 1st foo Function<Integer, Number> f2 = this::foo;
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
Integer foo(){…}
整数foo(数x){…}
供应商f1=此::foo;//()->编号,匹配第一个foo
函数f2=this::foo;//Int->Number,匹配第二个foo
本质上,f2
可以接受一个整数
并返回一个数字
,编译器可以发现第二个foo()
满足要求。来自:
哪里可以使用lambda表达式?
- 方法或构造函数参数,其目标类型是 适当的参数。如果方法或构造函数重载,则 在lambda之前,通常使用过载解析机制 表达式与目标类型匹配。(决议通过后, 仍然可能有多个匹配的方法或构造函数 接受不同功能接口且具有相同功能的签名 函数描述符。在这种情况下,lambda表达式必须 转换为这些功能接口之一的类型)
- 强制转换表达式,显式提供目标类型。例如:
因此,如果存在不明确的签名,则需要强制转换它。由于lambda表达式是函数接口的缩写,因此应该可以从接口中的方法推断方法的类型。@LeonardBrünings:这不是指lambda表达式,而是指方法引用,它们是不同的。lambda表达式是函数的实现;方法引用是对一个预先存在的类中预先存在的方法的引用。@LouisWasserman根据我链接到的文章,方法引用将被实现为lambdas,因此是我的标记。你为什么接受一个答案,而这个答案甚至远未回答你的问题?@Holger It's Answers,它的签名与函数类型匹配,或者如果需要消除歧义,您可能需要强制转换为特定类型。我将编辑答案,把它拼出来。
Object o = () -> { System.out.println("hi"); }; // Illegal: could be Runnable or Callable (amongst others)
Object o = (Runnable) () -> { System.out.println("hi"); }; // Legal because disambiguated