方法"如何引用特定类型的任意对象的实例方法"解决任意对象?

时间:2015-09-29 23:04:08

标签: java lambda java-8 method-reference

oracle Java 8 documentation定义了4种类型的方法引用,而不是Lambda表达式。我想要理解的是那种方法引用描述为:"引用特定类型的任意对象的实例方法"写成ContainingType::methodName

我不确定我是否遗漏了某些东西,但对我而言似乎更像是: "引用功能接口的抽象方法的第一个参数,假设它是ContainingType"类型。我试图想出这个“任意对象”的例子。是第二个参数,但当然不会编译。

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

  1. 任意对象必须是功能界面的抽象方法的第一个参数
  2. 方法参考的签名必须与功能界面的抽象方法的签名相同,不带第一个参数
  3. 因此,抽象方法A method(B b, C c, D d)的功能接口只能传递实例方法引用x::methodImplB::methodImpl。我无法通过C::methodImpl,例如,它将是一个具有签名C的类A methodImpl(B b, D d)的实例。

    我还缺少其他任何案例,这可能是Oracle以这种模棱两可的方式写这个的原因吗?

1 个答案:

答案 0 :(得分:6)

不,你的理解是正确的。您链接的文档暗示(但没有充分强调)给定一个期望args a1, a2, a3, ...的函数接口,此类型的方法引用等同于调用a1.namedMethod(a2, a3, ...)的lambda。

请注意,为了保持一致性,需要这样的具体定义 - 给定关于具有两个String参数(String s1, String s2)的功能接口的链接文档的示例,您将如何确定是否行为将是s1.doThing(s2)s2.doThing(s1)否则?

您可以在the JLS

中准确找到此指定
  

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