Fehlerhafter Typ auf dem Operandenstapel… Mit JDK 8 schlagen Lambdas mit anonymen inneren Klassen fehl. Warum?

Das Ausführen des folgenden Codes führt zu der FehlermeldungBad type on operand stack.

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);
    }

Wenn Sie jedoch die doppelte geschweifte Klammer (anonyme innere Klassen) innerhalb des lamda entfernen, kann der Code wie erwartet ausgeführt werden. Warum? Das Folgende funktioniert:

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);
    }
}

Compiler-Fehler? Es ist immerhin die Early-Access-Version ...

(Dies wird erst kompiliert, wenn Sie die neueste habenjdk 8 lambda herunterladen.)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage