Załóżmy Mam metodę z następującym podpisem:typu bezpiecznie utworzyć instancję Function zostać przekazany do Comparator.comparing()
<T, U extends Comparable<? super U>> Comparator<T> method(Map<String, Function<? super T, ? extends U>> comparatorFunctionMap)
Metoda akceptuje mapę funkcji (z kluczami tekstowymi) i tworzy w wyniku tego powstaje Comparator<T>
(nie jest ważne jak). Wartości map są instancjami Function<? super T, ? extends U>
, dzięki czemu można je bezpośrednio przekazać do Comparator.comparing()
.
Jak zapełnić tę mapę w bezpieczny sposób? Powiedzmy, że mam klasę Person
z atrybutami name
i age
(i pobierającymi je dla nich).
Kiedy należy wykonać następujące czynności:
Map<String, Function<? super Person, ? extends Comparable>> map1 = new HashMap<>();
map1.put("name", Person::getName);
method(map1);
otrzymuję ostrzeżenie na linii 1 i 3. Jeśli próbuję to zamiast, na przykład:
Map<String, Function<? super Person, ? extends Comparable<?>>> map2 = new HashMap<>();
map2.put("name", Person::getName);
method(map2);
Trzecia linia jest błąd kompilacji .
Czy istnieje sposób na bezpieczne wykonanie tego typu?
Nie otrzymuję żadnego ostrzeżenia przy użyciu pierwszego fragmentu (surowe porównywalne). – Eran
Czy potrzebujesz funkcji na mapie, aby móc zwrócić więcej niż jeden typ? np. czy ta sama mapa musi zawierać funkcję "Function" i "Function "? –
@MikeStrobel: Tak, chodziło o to, aby pozwolić różnym porównywalnym typom (przynajmniej ciągi i liczby, ale być może także innym) na mapie. Teraz widzę, że to główny problem. – Ondra