Myślę, że rozumiem twoje pytanie. Chcesz serializować Foo<T>
i masz obiekt klasy T
w środowisku wykonawczym (ale nie jest on naprawiony w czasie kompilacji). Dlatego sugerowane rozwiązanie w Gson tworzenia anonimowej podklasy TypeToken
nie działa, ponieważ wymaga to, aby sparametryzowany typ (na przykład Foo<String>
) był zakodowany w czasie kompilacji i nie zadziała, jeśli użyjesz czegoś takiego jak Foo<T>
.
Zobaczmy jednak, co naprawdę osiąga metodana stronie Gson. Tworzysz obiekt anonimowej podklasy TypeToken
, a następnie pytasz o jego parametr typu, używając metody getType()
. Nadklasa klasy jest częścią jej metadanych i zawiera ogólne parametry jej nadklasy. Tak więc w czasie wykonywania może on przyjrzeć się własnej hierarchii dziedziczenia i dowiedzieć się, jaki typ parametru został użyty dla TypeToken
, a następnie zwraca instancję java.lang.reflect.Type
dla tego typu (która, jeśli jest sparametryzowana, będzie instancją ParameterizedType
). Po uzyskaniu tej instancji Type
, należy przekazać ją jako drugi argument toGson()
.
Wszystko, co musimy zrobić, to znaleźć inny sposób na utworzenie tego wystąpienia: ParameterizedType
. ParameterizedType
to interfejs, ale niestety, publiczne API Java nie zapewnia żadnych konkretnych implementacji ani żadnego sposobu dynamicznego tworzenia ParameterizedType
. Wygląda na to, że istnieje klasa o nazwie ParameterizedTypeImpl
, w prywatnych Sun API iw kodzie Gsona, którego możesz użyć (e.g. here). Możesz po prostu skopiować kod i zmienić jego nazwę na własną klasę.Następnie, aby utworzyć obiekt Type
reprezentujący Foo<String>
w środowisku wykonawczym, można po prostu zrobić coś takiego, jak new ParameterizedTypeImpl(Foo.class, new Type[]{String.class}, null)
(untested)
Dlaczego go potrzebujesz? Typ erasure sprawia, że idea jest bez sensu, więc spróbuj wyjaśnić, co próbujesz osiągnąć. – Viruzzo
Potrzebuję go, aby udostępnić bibliotekę serializacji (de) serializacji (google gson w tym przypadku) obiektu typu reprezentującego moje oczekiwane typy podczas deserializacji z łańcucha JSON. Wymazanie nie ma sensu, ponieważ obiekt typu zostanie sprawdzony w czasie wykonywania. – SoftMemes
"Co jest potrzebne dla biblioteki, której używam, aby zobaczyć pole jako typ podany w czasie wykonywania", "obiekt typu reprezentujący moje spodziewane typy", co to znaczy? Czy możesz rozwinąć to, co próbujesz zrobić? – Viruzzo