Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非空参数的方法引用?_Java_Lambda_Java 8 - Fatal编程技术网

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