未绑定的方法引用是指没有关联对象的普通(非静态)方法。 使用未绑定的引用之前,我们必须先提供对象。
class X {
String f() { return "X::f()"; }
}
interface MakeString {
String make();
}
interface TransformX {
String transform(X x);
}
public class UnboundMethodReference {
public static void main(String[] args) {
// MakeString ms = X::f; // 无法通过编译
TransformX sp = X::f; // 可以通过编译
X x = new X();
System.out.println(sp.transform(x)); // [1]
System.out.println(x.f()); // 与[1]同等效果
}
}
注意上面代码中,如果被赋值的方法引用和需要赋值的接口方法的签名(参数和返回值)相同,那么对于未绑定的方法引用,必须提供对象实例;如果需要赋值的接口方法中的参数中有该类的对象,则认为需要一个这样的对象来调用方法,因此参数可以不完全匹配。不完全匹配的意思是被赋值方法引用除了该对象外,其余参数匹配。如下代码所示。
class This {
void two(int i, double d) {}
void three(int i, double d, String s) {}
void four(int i, double d, String s, char c) {}
}
interface TwoArgs {
void call2(This athis, int i, double d);
}
interface ThreeArgs {
void call3(This athis, int i, double d, String s);
}
interface FourArgs {
void call4(
This athis, int i, double d, String s, char c);
}
public class MultiUnbound {
public static void main(String[] args) {
TwoArgs twoargs = This::two;
ThreeArgs threeargs = This::three;
FourArgs fourargs = This::four;
This athis = new This();
twoargs.call2(athis, 11, 3.14);
threeargs.call3(athis, 11, 3.14, "Three");
fourargs.call4(athis, 11, 3.14, "Four", 'Z');
}
}
另外,如果接口中的方法有返回类型,即要求有值进行返回,那么被赋值的方法引用必须要有返回值;如果接口中的方法没有返回类型,那么对于被赋值的方法,其返回值可以有也可以没有。