¿Cómo se interpretan los parámetros y argumentos entre la interfaz funcional y una función en contexto de referencia 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 tiene una función isGreater (*) que cuente el número de valores que son menos de un valor que se pasa como argumento. Mi confusión es cómo interface MyFunc<T>inferir que esta declaración de retorno (**) que comparan dos variables de instancia de Foo valoran tiene 2 parámetros. Para hacerlo más claro cómo MyFunc<T>toma (T v1, T v2)como parámetros y este es un juego con la función isGreater(Foo obj)que toma una referencia de tipo Foo como un argumento.

barredora:

Tenga en cuenta que isGreateres un ejemplo del método. ¿Cómo llamaría usted a un método de instancia de Foo? Usted necesitaría un ejemplo de Foo, además de todos los parámetros requeridos por el método.

En el caso de isGreater, que realmente necesita dos instancias de Foollamarlo (a pesar de que sólo tiene 1 Foocomo parámetro):

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

Observe también cómo cuando se utiliza Foo::isGreater, no se le Realizar cualquier instancia de Foollamar isGreateren! Normalmente esto no sería trabajar con un método de instancia, pero los diseñadores del lenguaje Java lo vio venir y se permite esto.

En cualquier caso, se necesita una instancia de Fooen el que llamar isGreatery otra instancia de pasar como parámetro. Por lo tanto, podemos "reescribir" isGreatercomo un método estático como sigue:

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

La instancia en la que usted llama isGreaterconsiguió "promovido" como parámetro! Esto no es realmente desee sucede bajo el capó, pero esto todavía sirve como una explicación de por qué esto es posible en el primer lugar.

Supongo que te gusta

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