当前位置: 首页 > 知识库问答 >
问题:

“引用特定类型的任意对象的实例方法”方法如何解析任意对象?[副本]

郝冥夜
2023-03-14

oracleJava8留档定义了4种类型的方法引用,您可以使用它来代替Lambda表达式。我试图理解的是描述为:“引用特定类型的任意对象的实例方法”的那种方法引用,它被写为ContainingType::方法名称

我不确定我是否错过了什么,但对我来说似乎更像是:“引用函数接口抽象方法的第一个参数,假设它是ContainingType类型”。我试图提出这个“任意对象”是第二个参数的示例,但当然它不编译。

是否有官方参考编译器如何解析此对象?我的理解是否正确:

  1. 任意对象必须是函数接口抽象方法的第一个参数
  2. 方法引用的签名必须与函数接口的抽象方法的签名相同,没有第一个参数

因此,具有抽象方法A方法(B b, C c, D d)的函数接口只能传递实例方法引用x::方法ImplB::方法Impl。我无法传递C::方法Impl例如,它将是类Chtml" target="_blank">实例,其签名A方法Impl(B b, D d)

我是否还遗漏了其他案例,这可能是Oracle以如此含糊的方式撰写本文的原因?

共有1个答案

华修永
2023-03-14

不,你的理解是正确的。您链接的文档暗示(但没有充分强调)给定一个需要argsa1、a2、a3、的函数接口,这种类型的方法引用相当于调用a1.namedMethod(a2、a3、…)的lambda。

请注意,出于一致性考虑,需要这样一个具体定义-给定带有两个参数(字符串s1,字符串s2)的函数接口的链接文档示例,您如何确定行为是s1.doThing(s2)还是s2.doThing(s1)?

您可以在JLS中找到这一点:

如果编译时声明是实例方法,则方法调用表达式的参数(如果有)是调用方法的第二个和后续形式参数。否则,方法调用表达式的参数是调用方法的形式参数。

 类似资料:
  • oracle Java8文档定义了4种可以用来代替Lambda表达式的方法引用类型。我试图理解的是描述为“对特定类型的任意对象的实例方法的引用”的方法引用,它被写成。 任意对象必须是函数接口的抽象方法的第一个参数。 方法引用的签名必须与函数接口的抽象方法的签名相同,没有第一个参数。 因此,具有抽象方法的函数接口只能传递实例方法引用或。例如,我无法传递,其中它是类的实例,其签名为。 是否还有其他案例

  • 在Java8中有“方法引用”特性。其中一种是“对特定类型的任意对象的实例方法的引用” http://docs.oracle.com/javase/tutorial/java/javao/methodreferences.html#类型

  • 在Java8中有“方法引用”特性。其中一种是“对特定类型的任意对象的实例方法的引用” http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type 有人能解释一下在这种情况下“特定类型的任意对象”是什么意思吗?

  • 问题内容: 在Java 8中,具有“方法参考”功能。一种是“引用特定类型的任意对象的实例方法” http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type 有人可以解释在这种情况下“特定类型的任意对象”是什么意思吗? 问题答案: 它是对某种类型的实例方法的引用。在此示例中,是的方法。程序知道可以在的实例

  • 假设我有一段代码,可以创建一个具有给定名称的苹果实例 这条线可以被许多玩家调用,每个玩家都有一个Apple类的实例,在这个实例中,名称有点像ID 现在假设在Apple类中有一个ArrayList,它存储每个玩家的朋友 还有一个getter/setter用于更新和检索朋友,所以如果一个特定的玩家键入一个命令 /addfriend将一个朋友添加到他的特定实例数组列表中,我将如何做到这一点? 示例,更新

  • 我正在尝试使用OAS v2定义一个API,它将返回一个有效负载以及一些元数据。 换句话说,对API的响应将是: 有效负载可以是任何内容,并且在不同的场景下会有所不同,唯一的限制是它将是有效的JSON格式。因此,现在,我想将其定义为一个JSON对象,而不定义字段级别的细节。 如何在OAS2/JSON模式中做到这一点? 提前谢谢。