Intellij - peut être remplacé avec la méthode de référence
Toujours lorsque j'utilise les expressions lambda comme ceci:
.map(obj -> foo.makeSomething(obj))
IntelliJ suggère: "Peut être remplacé avec la méthode de référence...". Et quand j'essaie alors:
.map(Foo::makeSomething)
- Je obtenir la déclaration suivante: "Non méthode statique ne peut pas être référencé à partir d'un contexte statique".
Pourquoi l'Idée suggère que moi je dois utiliser la méthode de référence si ce n'est pas correct?
Est-ce que ça suggèrent que le remplacement? Ou est-ce juste ce que vous écrivez vous-même? Je me serais attendu à
C'est
Double Possible de Java 8 Référence à une Méthode non-statique méthode
la version de IntelliJ IDEA utilisez-vous?
TY pour que les raccourcis - mon dieu pour la vie de moi je ne pourrais pas comprendre comment le dire IJ pour le faire! Tout cela a été inutile popup encore plus inutile suggestion à aller dans les paramètres où il n'y a rien de pertinent à ce code !! Se penchant de plus en plus vers Eclipse maintenant 🙁 qui a bien le droit-cliquez sur l'option
foo::makeSomething
, qui serait de travailler.C'est
foo::makeSomething
. Vous voulez appeler la méthode sur l'objet foo, et non pas sur la classe Foo. Vous pourriez tout aussi bien laisser IntelliJ transformer le code pour vous (Alt-Enter).Double Possible de Java 8 Référence à une Méthode non-statique méthode
la version de IntelliJ IDEA utilisez-vous?
TY pour que les raccourcis - mon dieu pour la vie de moi je ne pourrais pas comprendre comment le dire IJ pour le faire! Tout cela a été inutile popup encore plus inutile suggestion à aller dans les paramètres où il n'y a rien de pertinent à ce code !! Se penchant de plus en plus vers Eclipse maintenant 🙁 qui a bien le droit-cliquez sur l'option
OriginalL'auteur user | 2017-07-02
Vous devez vous connecter pour publier un commentaire.
Comme vous l'écrivez :
le compilateur s'attend à une de ces deux possibilités :
l'invocation d'une
Foo.makeSomething()
méthode d'instance sur le premier paramètre de la lambda qui doit être défini comme unFoo
.l'invocation d'une
Foo.makeSomething()
méthode statique.La première possibilité est éliminé par le compilateur comme le premier paramètre de la lambda déclarée
obj
n'est pas unFoo
.Et en fonction de votre message d'erreur,
Foo.makeSomething()
est une méthode d'instance :La deuxième possibilité (en invoquant un
Foo.makeSomething()
méthode statique) n'est pas légale, soit en tant quemakeSomething()
n'est pas statique.En fait, ce que vous voulez, c'est l'application de la
makeSomething()
méthode d'instance sur une variable qui ne fait pas partie de la lambda paramètres.Vous pouvez le faire, mais vous devez utiliser une autre syntaxe.
Au lieu de spécifier
Foo::
, utilisezfoo::
.De cette façon, la méthode d'instance
makeSomething()
sera appliquée sur lefoo
variable :Vous êtes les bienvenus 🙂 En fait, vous avez trois cas d'appliquer la méthode références: 1)méthode statique, 2)méthode d'instance pour les paramètres de la lambda et 3)méthode d'instance pour une variable non déclarée dans le lambda paramètres. Et pour le dernier cas, la syntaxe est en effet différente.
OriginalL'auteur davidxxx