oracle Java 8 documentation定义了4种类型的方法引用,而不是Lambda表达式。我想要理解的是那种方法引用描述为:"引用特定类型的任意对象的实例方法"写成ContainingType::methodName
。
我不确定我是否遗漏了某些东西,但对我而言似乎更像是:
"引用功能接口的抽象方法的第一个参数,假设它是ContainingType
"类型。我试图想出这个“任意对象”的例子。是第二个参数,但当然不会编译。
是否有官方参考编译器如何解析此对象?我的理解是正确的:
因此,抽象方法A method(B b, C c, D d)
的功能接口只能传递实例方法引用x::methodImpl
或B::methodImpl
。我无法通过C::methodImpl
,例如,它将是一个具有签名C
的类A methodImpl(B b, D d)
的实例。
我还缺少其他任何案例,这可能是Oracle以这种模棱两可的方式写这个的原因吗?
答案 0 :(得分:6)
不,你的理解是正确的。您链接的文档暗示(但没有充分强调)给定一个期望args a1, a2, a3, ...
的函数接口,此类型的方法引用等同于调用a1.namedMethod(a2, a3, ...)
的lambda。
请注意,为了保持一致性,需要这样的具体定义 - 给定关于具有两个String
参数(String s1, String s2)
的功能接口的链接文档的示例,您将如何确定是否行为将是s1.doThing(s2)
或s2.doThing(s1)
否则?
您可以在the JLS:
中准确找到此指定如果编译时声明是实例方法,则方法调用表达式的参数(如果有)是调用方法的第二个和后续形式参数。否则,方法调用表达式的参数是调用方法的形式参数。