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);
}
}
Este código tem um isGreater função (*) que contar o número de valores que são menos de um valor passado como argumento. Minha confusão é como interface MyFunc<T>
inferir que esta declaração de retorno (**) que comparar duas variáveis de instância Foo valorizar tem 2 parâmetros. Para torná-lo mais claro como MyFunc<T>
toma (T v1, T v2)
como parâmetros e esta é uma correspondência com a função isGreater(Foo obj)
que leva uma referência do tipo Foo como um argumento.
Note-se que isGreater
é um exemplo de método. Como você chamar um método de instância Foo
? Você precisaria de uma instância de Foo
, além de todos os parâmetros necessários pelo método.
No caso de isGreater
, você realmente precisa de duas instâncias de Foo
chamá-lo (mesmo que ele só precisa de 1 Foo
como parâmetro):
foo1.isGreater(foo2)
^^^^ ^^^^
Também observe como quando você usa Foo::isGreater
, você não está dando qualquer instância Foo
para chamar isGreater
on! Normalmente isso não iria trabalhar com um método de instância, mas os projetistas da linguagem Java viu chegando e permitiu isso.
Em qualquer caso, você precisa de uma instância de Foo
onde chamar isGreater
e outra instância para passar como parâmetro. Portanto, podemos "reescrever" isGreater
como um método estático como este:
public static boolean isGreater(Foo foo1, Foo foo2) {
return foo1.isGreater(foo2);
}
A instância em que você chama isGreater
foi "promovido" como um parâmetro! Isto não é realmente querem acontece nos bastidores, mas isso ainda serve como uma explicação de por que isso é possível em primeiro lugar.