パラメータ及び引数は、メソッド参照文脈における機能インタフェースと機能との間でどのように解釈されますか

ボリスBorovski:
interface MyFunc<T> {
  boolean func(T v1, T v2);
}

class Foo {
  private int value;

  Foo(int v) { value = v; }

  boolean isGreater(Foo obj) {   <-- (*)
    return value > obj.value;    <-- (**)    
  }
}

class Demo {
  static <T> int counter(T[] vals, MyFunc<T> f, T v) {
    int count = 0;

    for (int i = 0; i < vals.length; i++)
      if (f.func(vals[i], v)) 
        count++;

    return count;
  }

  public static void main (String [] args) {
    int count;

    Foo[] values = new Foo[10];

    for (int i = 0; i < values.length; i++)
      values[i] = new Foo(i);

    count = counter(values, Foo::isGreater, new Foo(5));

    System.out.println("values bigger " + count);
  }
}

このコードは、以下の引数として渡された値よりも値の数をカウントする機能isGreater(*)を持っています。私の混乱はどのようにあるinterface MyFunc<T>2 Fooのインスタンス変数を比較し、このreturn文(**)は2つのパラメータを持っている価値と推測します。それをより明確にするためには、どのようにMyFunc<T>とる(T v1, T v2)のパラメータとして、これは、関数とのマッチングでisGreater(Foo obj)、引数としてFoo型の参照を取ります。

スイーパー:

予告isGreaterされたインスタンスメソッド。どのようにのインスタンスメソッドを呼ぶだろうかFooあなたは必要となるインスタンスのをFooメソッドに必要なすべてのパラメータに加えて、。

以下の場合はisGreater、あなたが実際の2つのインスタンスを必要とするFoo(それが唯一の1を必要としていても、それを呼び出すためFooのパラメータとして):

foo1.isGreater(foo2)
^^^^           ^^^^

また、使用時にどのように通知をFoo::isGreater、あなたはそれを任意のインスタンス与えていないFoo呼び出すためisGreaterには!通常、これはインスタンスメソッドでは動作しませんが、Java言語の設計者は、それが来るのを見たと、これを許可しました。

いずれにせよ、あなたはのインスタンス必要Foo呼び出すためのisGreaterパラメータとして渡すと別のインスタンスを。したがって、我々は「書き換える」ことができisGreater、このような静的メソッドとして:

public static boolean isGreater(Foo foo1, Foo foo2) {
    return foo1.isGreater(foo2);
}

インスタンスは、これであなたは、コールisGreaterのパラメータとして「昇格」しまいました!これは欲しいが、ボンネットの下に起こる本当にありませんが、これはまだ、これが最初の場所で可能である理由の説明として機能します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=228011&siteId=1