Pourquoi cette atsortingbution de référence de méthode comstack-t-elle?

J’ai du mal à comprendre pourquoi le code suivant comstack:

public class MethodRefs { public static void main(Ssortingng[] args) { Function f; f = MethodRefs::getValueStatic; f = MethodRefs::getValue; } public static Ssortingng getValueStatic(MethodRefs smt) { return smt.getValue(); } public Ssortingng getValue() { return "4"; } } 

Je peux voir pourquoi la première affectation est valide – getValueStatic correspond évidemment au type de Function spécifié (il accepte un object MethodRefs et retourne une Ssortingng ), mais la seconde me déconcerte – la méthode getValue n’accepte aucun argument, alors pourquoi est-il toujours valide? l’affecter à f ?

Le deuxième

 f = MethodRefs::getValue; 

est le même que

 f = (MethodRefs m) -> m.getValue(); 

Pour les méthodes non statiques, il y a toujours un argument implicite qui est représenté comme this dans l’appelé.

REMARQUE: L’implémentation est légèrement différente au niveau du code d’octet mais elle fait la même chose.

Permet de l’étoffer un peu:

 import java.util.function.Function; public class MethodRefs { public static void main(Ssortingng[] args) { Function f; final MethodRefs ref = new MethodRefs(); f = MethodRefs::getValueStatic; f.apply(ref); //is equivalent to MethodRefs.getValueStatic(ref); f = MethodRefs::getValue; f.apply(ref); //is now equivalent to ref.getValue(); } public static Ssortingng getValueStatic(MethodRefs smt) { return smt.getValue(); } public Ssortingng getValue() { return "4"; } } 

Une méthode non statique prend essentiellement this référence comme un type d’argument spécial. Normalement, cet argument est écrit de manière particulière (avant le nom de la méthode, au lieu de celui entre parenthèses), mais le concept est le même. La méthode getValue prend un object MethodRefs (c’est son) et retourne une chaîne, elle est donc compatible avec l’interface Function .

Dans le didacticiel Java, il est expliqué qu’il existe 4 types de références de méthodes différents:

  1. référence à une méthode statique
  2. référence à une méthode d’instance d’un object particulier
  3. référence à une méthode d’instance d’un object arbitraire d’un type particulier
  4. référence à un constructeur

Votre cas est # 3, ce qui signifie que lorsque vous avez une instance de MethodRef c’est-à-dire ref , l’appel MethodRef sur votre fonction f sera équivalent à Ssortingng s = ref.getValue() .

Pour les méthodes non statiques, le type de this méthode est considéré implicitement comme le premier type d’argument. Comme il est de type MethodRefs , les types sont MethodRefs .