Java 未绑定的方法引用

未绑定的方法引用是指没有关联对象的普通(非静态)方法。 使用未绑定的引用之前,我们必须先提供对象。

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');
  }
}

另外,如果接口中的方法有返回类型,即要求有值进行返回,那么被赋值的方法引用必须要有返回值;如果接口中的方法没有返回类型,那么对于被赋值的方法,其返回值可以有也可以没有。

你可能感兴趣的:(学学学Java)