4 votes

Comment implémenter la méthode toArray() pour ArrayList avec un paramètre Lambda ?

Je mets en œuvre la classe

class PairStringList extends ArrayList<String> {
...

@Override
    public <T> T[] toArray(T[] a) {
        return super.toArray(a);
    }
}

J'ai écrit des tests pour cette classe, et ils utilisent une telle déclaration :

assertArrayEquals(new String[]{}, list.toArray(String[]::new));

Je constate qu'ils utilisent Lambda comme paramètre. Comment puis-je implémenter la méthode toArray() pour exécuter le test correctement ? Maintenant, j'ai la sortie de construction suivante :

pas de méthode appropriée trouvée pour toArray(String[]::new) la méthode Java.util.Collection.toArray(T[]) n'est pas applicable (ne peut pas déduire le(s) type(s) variable(s) T (argument mismatch ; Array n'est pas une interface fonctionnelle))

Comment puis-je résoudre ce problème ?

Remarque : Je ne peux pas modifier le code des tests

Merci à tous ! Le problème a été résolu. Le problème était que les tests étaient écrits en Java 11, mais que j'utilisais Java 8. Après la mise à jour vers Java 11, tout se construit et se compile.

2voto

tevemadar Points 5069

Il s'agit d'une autre toArray() vous pouvez également l'intégrer en appelant la méthode super :

@Override
public <T> T[] toArray(IntFunction<T[]> generator) {
  return super.toArray(generator);
}

ou même "voler" l'implémentation par défaut de /lib/src.zip/java.base/util/Collection.java :

@Override
public <T> T[] toArray(IntFunction<T[]> generator) {
  return toArray(generator.apply(0));
}   

et en fait, votre test peut réussir même sans rien mettre en œuvre, puisque la fonction ArrayList<String> les fournit de toute façon.

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