176 votes

Comment spécifier les types de fonctions pour les méthodes void (non Void) en Java8 ?

Je m'amuse avec Java 8 pour découvrir comment les fonctions sont des citoyens de première classe. J'ai l'extrait suivant :

package test;

import java.util.*;
import java.util.function.*;

public class Test {

    public static void myForEach(List<Integer> list, Function<Integer, Void> myFunction) {
      list.forEach(functionToBlock(myFunction));
    }

    public static void displayInt(Integer i) {
      System.out.println(i);
    }

    public static void main(String[] args) {
      List<Integer> theList = new ArrayList<>();
      theList.add(1);
      theList.add(2);
      theList.add(3);
      theList.add(4);
      theList.add(5);
      theList.add(6);
      myForEach(theList, Test::displayInt);
    }
}

Ce que j'essaie de faire, c'est de passer la méthode displayInt à la méthode myForEach en utilisant une méthode de référence. Le compilateur produit l'erreur suivante :

src/test/Test.java:9: error: cannot find symbol
      list.forEach(functionToBlock(myFunction));
                   ^
  symbol:   method functionToBlock(Function<Integer,Void>)
  location: class Test
src/test/Test.java:25: error: method myForEach in class Test cannot be applied to given ty
pes;
      myForEach(theList, Test::displayInt);
      ^
  required: List<Integer>,Function<Integer,Void>
  found: List<Integer>,Test::displayInt
  reason: argument mismatch; bad return type in method reference
      void cannot be converted to Void

Le compilateur se plaint que void cannot be converted to Void . Je ne sais pas comment spécifier le type de l'interface de la fonction dans la signature de la fonction myForEach de sorte que le code se compile. Je sais que je pourrais simplement changer le type de retour de displayInt a Void et retourner ensuite null . Cependant, il peut y avoir des situations où il n'est pas possible de modifier la méthode que je veux passer ailleurs. Existe-t-il un moyen simple de réutiliser displayInt tel qu'il est ?

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