oracle Java 8 documentation définit 4 types de références de méthode que vous pouvez utiliser à la place des expressions Lambda. Ce que j'essaie de comprendre, c'est le type de référence de méthode décrit comme: "Référence à une méthode d'instance d'un objet arbitraire d'un type particulier" qui s'écrit ContainingType::methodName
.Comment une méthode "référence à une méthode d'instance d'un objet arbitraire d'un type particulier" résout-elle l'objet arbitraire?
Je ne sais pas si je manque quelque chose, mais pour moi, il semble plus comme: « Référence au premier paramètre de la méthode abstraite de l'interface fonctionnelle, en supposant qu'il est de type ContainingType
». J'ai essayé de trouver des exemples où cet 'objet arbitraire' est le deuxième paramètre, mais bien sûr il ne compile pas.
Existe-t-il une référence officielle sur la façon dont cet objet est résolu par le compilateur? Suis-je bien entendu que:
- L'objet arbitraire doit être le 1er paramètre de la méthode abstraite de l'interface fonctionnelle.
- La signature de la référence de méthode doit être la même que celle de la méthode abstraite de l'interface fonctionnelle, sans le premier paramètre.
donc une interface fonctionnelle avec méthode abstraite A method(B b, C c, D d)
ne peut être transmis méthode d'instance ou références x::methodImpl
B::methodImpl
. Il n'y a aucun moyen que je puisse passer C::methodImpl
par exemple, où ce serait une instance de la classe C
avec sa signature A methodImpl(B b, D d)
.
Y at-il d'autres cas qui me manquent, ce qui pourrait être la raison pour laquelle Oracle a écrit ceci d'une manière si ambiguë?
'B :: methodImpl' référence une méthode d'instance arbitraire' b' de type 'B'. Le 'b' arbitraire sera passé à la fonction en tant que 1er paramètre. – ZhongYu
Que faire si la méthode d'instance dans 'B' a la signature suivante:' Une méthodeImpl (C c) '(manquant l'argument D) va-t-elle fonctionner, ignorant le dernier argument de l'expression lambda? Comme lorsque nous faisons '(B b, C c, D d) -> b.methodImpl (c)'? Ou la signature doit-elle correspondre exactement? – jbx
Pensez à une méthode d'instance en tant que méthode statique, avec un 1er paramètre supplémentaire. Donc 'A methodImpl (C c)' est un peu comme 'static A methodImpl (B b, C c)'. Par conséquent, la référence à cette méthode est compatible avec les fonctions de forme '(B, C) -> A' – ZhongYu