29 votes

Comment utiliser une référence de méthode sur une importation statique?

Lorsque j'utilise des fonctions de carte en java, je peux faire ce qui suit:

 import com.example.MyClass;

someStream.map(MyClass::myStaticMethod)
 

mais dans mon projet, nous utilisons parfois des importations statiques, comment puis-je référencer myStaticMethod lorsque l'importation est statique?

Je pense que cela fonctionnerait, mais cela ne fonctionne pas:

 import static com.example.MyClass.myStaticMethod;

someStream.map(myStaticMethod); //does not compile
 

Pourquoi ça ne marche pas? Suis-je «coincé» avec le premier exemple ou existe-t-il d'autres solutions.

29voto

NPE Points 169956

Regardons la partie pertinente de l'Java Language Specification, 15.13. Méthode De Référence Expressions.

Il répertorie les méthodes suivantes pour créer une méthode de référence:

MethodReference:
  ExpressionName :: [TypeArguments] Identifier 
  ReferenceType :: [TypeArguments] Identifier 
  Primary :: [TypeArguments] Identifier 
  super :: [TypeArguments] Identifier 
  TypeName . super :: [TypeArguments] Identifier 
  ClassType :: [TypeArguments] new 
  ArrayType :: new

Notez que tous comprennent un :: jeton.

Étant donné que l'argument someStream.map(myStaticMethod) ne comprennent ::, il n'est pas une méthode valable de référence.

Ceci suggère que vous avez besoin pour importer MyClass (peut-être en plus à la statique de l'importation, si c'est votre préférence) et de se référer à la méthode qu' MyClass::myStaticMethod.

4voto

Eugene Points 6271

Eh bien, il ne compile pas car le JLS dit. Mais qui ne peut même pas compiler car il serait un simple appel de méthode et non une méthode de référence qui est défini UNIQUEMENT à l'aide de l' :: de la notation, que ce soit statique ou de l'instance utilisé sur.

C'est un aspect intéressant encore, celui que vous ne pouvez pas résoudre - peut-être en ce moment. Il n'y a pas de support de la langue de définir quelque chose comme:

MethodRef <Class, Method> ref = ...

Et de les utiliser plus tard que la façon dont vous le souhaitez. Mais je ne pense même pas que ce serait possible, car vous devrez aussi définir les paramètres de types et de type de retour d'une certaine manière, parce que cela serait nécessaire pour voir si elle correspond à plusieurs autres endroits. Comme Predicate<String> et Function<String, Boolean> qui pourrait s'appliquer à la même method reference.

3voto

Grzegorz Piwowarek Points 7040

Le fait d'avoir une importation statique d'une méthode n'influence pas la façon dont vous lui définissez une référence de méthode.

Donc, si vous voulez que cela fonctionne, il devrait avoir exactement la même apparence qu'avant l'introduction de l'importation statique:

 MyClass::myStaticMethod
 

-2voto

brtln Points 21

Avec une importation statique d'une méthode, vous pouvez uniquement l'appeler mais pas vous y référer. Pour stream (). Map (), il a besoin d'une référence à une fonction afin de pouvoir l'appeler pour chaque entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X