Como os parâmetros e argumentos são interpretados entre a interface funcional e uma função no contexto de referência método

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

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.

Sweeper:

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 Foochamá-lo (mesmo que ele só precisa de 1 Foocomo parâmetro):

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

Também observe como quando você usa Foo::isGreater, você não está dando qualquer instância Foopara chamar isGreateron! 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 Fooonde chamar isGreatere outra instância para passar como parâmetro. Portanto, podemos "reescrever" isGreatercomo 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 isGreaterfoi "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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=228010&siteId=1
Recomendado
Clasificación