Einfluss des Java-Ternäroperators auf die Inferenz generischer Typen

public List<String> foo1() {
    List<String> retval = bar();
    if (retval == null)
        return Collections.emptyList();
    else
        return retval;
}

public List<String> foo2() {
    List<String> retval = bar();
    return retval == null ? Collections.emptyList() : retval;
}

Warum tutfoo1() kompiliert gut währendfoo2() hat einen fehler? (präziser sein"Typenkonflikt: Konvertierung von Liste <Erfassung Nr. 1 von? Erweitert Objekt> in Liste <Zeichenfolge> nicht möglich.")

Ich hätte gedacht, dass beide Funktionen zum gleichen Bytecode kompilieren würden, also sollte ein kluger Compiler den korrekten Typ für schließenemptyList()...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage