2017-01-11 1 views
1

Selon:Des références de méthode peuvent-elles être utilisées pour accéder à des méthodes statiques?

https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

Il ressemble à son possible, il essaie cependant des rendements réels d'une erreur de compilation. Il est plus logique que cela ne soit pas possible car nous ne pouvons pas implémenter des interfaces avec des méthodes statiques.

public class SomeClass { 

    static public boolean getB(){ 
     return false; 
    } 
} 

List<SomeClass> list = new ArrayList<>();  
list.add(new SomeClass()); 

// below causes compile error, which I expect, however documentation indicates oherwise 
list.stream().filter(SomeClass::getB).collect(Collectors.toList()); 

Voici l'erreur de compilation:

« marqueurs multiples à cette ligne - La méthode getB() du SomeClass type devraient être accessibles d'une manière statique - Le filtre méthode (prédicats) dans le type Stream n'est pas applicable pour les arguments (SomeClass :: getB) "

+2

Ajouter l'erreur de compilation? – nbokmans

+0

Qu'est-ce que 'list' ??? Où est-il déclaré? – CKing

+3

Peut-être provoqué par une incompatibilité de signature. 'filter'expects lambda a un paramètre et retourne booléen. Et vous essayez d'utiliser la méthode sans paramètres – nnesterov

Répondre

6

Vous pouvez, mais le type de retour et les arguments de la méthode doivent correspondre à ceux de la méthode unique de l'interface fonctionnelle (Predicate<Something> ici).

En supposant que votre liste est un List<Something>, puisque le prédicat est censé revenir un booléen basé sur une Something en entrée, votre code compilera si votre méthode est définie comme

public static boolean getB(Something s) 

ou

public static boolean getB(Object o) 
+0

Mais pourquoi ça marche quand je supprime statique? – newlogic

+1

Dans ce cas, la méthode est appelée sur chaque instance SomeClass du flux en cours de filtrage. L'entrée du prédicat est l'instance SomeClass elle-même (c'est-à-dire 'this'). La référence de la méthode, écrite comme un lambda, dans le cas d'une méthode statique est 'sc -> SomeClass.getB (sc)', et dans le cas d'une méthode d'instance 'sc -> sc.getB()'. –

+0

Pourquoi SomeClass :: getB fonctionne-t-il dans tous les cas? getB ne correspond pas à l'interface Predicate – newlogic