J'essaie d'unir Lambdas et des valeurs simples en varag. Erreur: le journal de la méthode ne peut pas être appliqué aux types donnés; Chaîne requise, objet [] Trouvé: String, String, Int, () -> "AAA", () -> 111 Raison: Mismatch de Varargs; L'objet n'est pas une interface fonctionnelle p> est-il possible de passer à la fois des Lambdas et des valeurs à Vararg? P> P>
3 Réponses :
Le problème est dans le message d'erreur
objet n'est pas une interface fonctionnelle p> blockQquote>
Vous pouvez uniquement créer une lambda pour une interface fonctionnelle (une avec exactement une méthode abstraite) objet n'est pas une interface et il n'a aucune méthode abstraite, vous ne pouvez donc pas créer de lambda de ce type. . Ce que vous pouvez faire est p>
xxx pré> de cette façon, le compilateur sait quel type de Lambda vous aviez destiné à mettre en œuvre. P>
par comparaison, vous pouvez écrire ce qui suit et ce se comporterait différemment dans votre méthode. p>
xxx pré> p>
Le problème est que objet code> n'est pas un
@funconalinterface code>. Cela étant dit que vous pouvez passer une simple instance anonyme comme ceci:
Log( "%s %d %s %d", "bbb", 222, (Supplier<String>) () -> "aaa");
Ma réponse est une alternative au tien.
Quel est le problème avec ça? Les Lambdas sont du sucre syntaxique pour les classes intérieures anonymes annotées avec @Functionalinterface code>.
Pour le compilateur, il n'existe aucun moyen de savoir quel type d'interface fonctionnelle est utilisé lorsque vous les supprimez (contrairement au premier, car vous avez défini cela dans le variableType)
de sorte qu'un correctif lancerait le fournisseur. Par exemple. (non testé) p> espérons que cela pointe dans la bonne direction. P> P>
Varargs doit avoir le même type, alors essayez ceci:
journal ("% S% D% d% d", (objet) "BBB", (objet) 222, (objet) () -> "AAA", (Objet) () -> 111); code>
@ Timothy Truckle Cette solution donnera toujours une erreur de compilateur.
J'ai essayé (objet), mais cela n'aide pas. (Fournisseur) casting a résolu le problème.