Lokalny genericsowy guru przemawia ;)

Co powiecie na klasę, która bierze Collection<?>, czyli dowolną kolekcję zupełnie dowolnych obiektów, i owija ją tak, żeby wyglądała jak Collection<T> gdzie T jest pewnym konkretnym typem (generycznym, rzecz jasna), do tego niekoniecznie występującym w pierwotnej kolekcji? Konwersja jest oczywiście dokonywana „w locie” i jest ekstremalnie niewydajna dla operacji innych niż iteracja ;) Klasa przyjmuje dwa generyczne parametry: typ „źródłowy” i typ „docelowy”; ignoruje wszystkie obiekty inne niż typu „źródłowego” a obiekty tegoż typu przerabia za pomocą obiektu pewnej klasy pomocniczej na obiekty typu „docelowego”.

Jeszcze muszę napisać wersję dla Map.

Albo co powiecie na klasę Parameters – poszerzone Properties, która to klasa może przechowywać wartości dowolnych znanych jej typów dokonując dowolnej konwersji pomiędzy nimi, a ponadto może zarezerwować niektóre klucze do specjalnej walidacji? Na przykład: wstawiamy pod danym kluczem wartość jako Integer a potem wyciągamy tą samą wartość spod tego samego klucza jako String i dostajemy ładnie przerobioną liczbę w postaci ciągu znaków. Inny klucz rezerwujemy jako nasz specjalny i mówimy, że może przechowywać tylko liczby, do tego z określonego przedziału. Może nie wyląda na nic specjalnego, ale półtora dnia się głowiłem jak to zrobić, żeby było jako-tako elegancko :]

Czy to nie wygląda przerażająco?

public <T> void setValue(Class<? super T> ct, String key, T value) throws ParametersException;

public <T> T getValue(Class<? extends T> ct, String key, T ifNull) throws ParametersException;

Jestem z siebie dumny ;)

5 uwag do wpisu “Lokalny genericsowy guru przemawia ;)

  1. Lisp has jokingly been called "the most intelligent way to misuse a computer". I think that description is a great compliment because it transmits the full flavor of liberation: it has assisted a number of our most gifted fellow humans in thinking previously impossible thoughts.
    — Edsger Dijkstra, CACM, 15:10

    Polubienie

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s