Warum dies nicht von Java 8 stream-Beispiel kompilieren?

Ich versuche, herauszufinden, warum dieser code nicht kompilieren auf JDK 1.8.0_45:

public class Example<E extends Example<E>> {
    public List<? extends Example<?>> toExamples(Collection<String> collection) {
        return collection.stream()
                .map(v -> lookup(v))
                .collect(Collectors.toList());
    }

    public static <E extends Example<E>> E lookup(String value) {
        return null;
    }
}

Hinzufügen, eine scheinbar unnötige cast behoben werden:

public class Example<E extends Example<E>> {
    public List<? extends Example<?>> toExamples(Collection<String> collection) {
        return collection.stream()
                .map(v -> (Example<?>) lookup(v))
                .collect(Collectors.toList());
    }

    public static <E extends Example<E>> E lookup(String value) {
        return null;
    }
}

Hier ist die Fehlermeldung vom compiler:

Example.java:9: error: incompatible types: inference variable R has incompatible bounds
              .collect(Collectors.toList());
                      ^
  equality constraints: List<Object>
  upper bounds: List<? extends Example<?>>,Object
where R,A,T are type-variables:
  R extends Object declared in method <R,A>collect(Collector<? super T,A,R>)
  A extends Object declared in method <R,A>collect(Collector<? super T,A,R>)
  T extends Object declared in interface Stream

Für einige Grund, der Rückgabetyp der lookup() ist nicht korrekt abgeleitet, um etwas erweitern Example.

  • aus Neugier, habe es kompilieren auf alle früheren Versionen von Java 8? dieser Bericht scheint schrecklich relevant: bugs.openjdk.java.net/browse/JDK-8077304
  • Was ist die genaue Fehlermeldung, die Sie bekommen?
  • Sie können auch ändern, die Signatur-Suche: public static <E extends Example<E>> Example<E> lookup(String value)
  • Eine weitere Instanz der generischen Methoden, die den Anspruch auf Rückkehr, was der Anrufer will...
Schreibe einen Kommentar