Come discusso in Bounding generics with 'super' keyword, il sistema di tipo Java è rotto/incompleto quando si tratta di limiti inferiori sui generici del metodo. Dato che Optional fa ora parte del JDK, sto iniziando a usarlo di più e i problemi che Guava ha riscontrato con i suoi Opzionali stanno iniziando a diventare un problema per me. Ho trovato un buon lavoro, ma non sono sicuro che sia sicuro. In primo luogo, mi impostazione lascia l'esempio:Soluzione sicura per i limiti controvarianti in Java?
public class A {}
public class B extends A {}
Vorrei essere in grado di dichiarare un metodo come:
public class Cache {
private final Map<String, B> cache;
public <T super B> Optional<T> find(String s) {
return Optional<T>.ofNullable(cache.get(s));
}
}
in modo che entrambe i seguenti lavori:
A a = cache.find("A").orElse(new A())
B b = cache.find("B").orElse(new B())
Come una soluzione alternativa, ho un metodo di utilità statica come segue:
public static <S, T extends S> Optional<S> convertOptional(Optional<T> optional) {
return (Optional<S>)optional;
}
Quindi, la mia ultima domanda, è sicura dal punto di vista del codice "ideale" sopra?
A a = OptionalUtil.<A,B>convertOptional(cache.find("A")).orElse(new A());
L'uso di un ternario è un po 'meno elegante, specialmente nelle espressioni lunghe – Dici
L'ineleganza di un uomo è la chiarezza di un altro uomo. L'eleganza di un uomo è il lambda non necessario di un altro uomo. Personalmente, mentre preferisco lambda per questo genere di cose, trovo la necessità di specificare per la mappa (x -> x) inelegante. (A proposito, mi piace la soluzione lambda, ed è per questo che l'ho descritta eccellente) – user1886323
Non stavo confrontando con l'altra risposta, ma con la sintassi di un mondo perfetto. Vorremmo gestire tutti i casi allo stesso modo, o il più vicino possibile. Comunque, stavo solo commentando: p La tua risposta funziona almeno allo – Dici