L'exécution du code ci-dessous entraîne l'affichage du message d'erreur Bad type on operand stack
.Mauvais type sur la pile d'opérandes ... en utilisant jdk 8, lambda avec des classes internes anonymes échoue, pourquoi?
public static void main(String args[]) {
TransformService transformService = (inputs) -> {
return new ArrayList<String>(3) {{
add("one");
add("two");
add("three");
}};
};
Collection<Integer> inputs = new HashSet<Integer>(2) {{
add(5);
add(7);
}};
Collection<String> results = transformService.transform(inputs);
System.out.println(results.size());
}
public interface TransformService {
Collection<String> transform(Collection<Integer> inputs);
}
Cependant la suppression de la double initialisation de renfort (classes internes anonymes) dans le lamda permet le code de fonctionner comme prévu, pourquoi? Les travaux ci-dessous:
public class SecondLambda {
public static void main(String args[]) {
TransformService transformService = (inputs) -> {
Collection<String> results = new ArrayList<String>(3);
results.add("one");
results.add("two");
results.add("three");
return results;
};
Collection<Integer> inputs = new HashSet<Integer>(2) {{
add(5);
add(7);
}};
Collection<String> results = transformService.transform(inputs);
System.out.println(results.size());
}
public interface TransformService {
Collection<String> transform(Collection<Integer> inputs);
}
}
Bogue de compilateur? Il est la première version d'accès après tout ...
(Ce ne compilera pas à moins que vous avez la dernière jdk 8 lambda download.)
La balise lambda est destinée aux langages autres que Java comme C#, C++. – Lion
@Lion: Je crois que Java 8 implémente lambdas (je ne l'ai jamais utilisé, donc je ne le sais pas pour un fait), et donc cette balise semble être appropriée à la question. –
@Lion c'est seulement parce que Java n'a jamais eu de lambda auparavant. Un lambda est un lambda, même s'il s'agit d'une version alpha de la langue. –