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
のパラメータとして「昇格」しまいました!これは欲しいが、ボンネットの下に起こる本当にありませんが、これはまだ、これが最初の場所で可能である理由の説明として機能します。