Определить параметры универсального типа во время выполнения в Java - PullRequest
1 голос
/ 16 июля 2010
class Json<T>
{
  @SerializedName( "T's type here" ) 
  private final ArrayList<T> _bucket = new ArrayList<T>( 5 );
  ...
}

Я хотел бы знать, как (если это возможно) общие параметры класса могут быть определены во время выполнения.Из того, что я прочитал, это возможно с подклассами универсальных типов, но я не смог выяснить, как это сделать с самим типом.В этих ссылках есть отличная информация, но я не уверен, что это то, что я ищу.

http://blog.xebia.com/2009/02/07/acessing-generic-types-at-runtime-in-java www.artima.com/weblogs/viewpost.jsp?thread=208860

В конечном итоге я пытаюсь добиться, чтобы Gson сериализовал указанную выше переменную _bucket как имя класса типа T.

Буду признателен, если кто-томожет указывать мне в правильном направлении.

Ответы [ 2 ]

6 голосов
/ 16 июля 2010

Общий тип недоступен во время выполнения в данном примере.Информация об универсальном типе доступна только через отражение, если она была указана во время компиляции - например, если вы определили подкласс SomeTypeJson extends Json<SomeType>.

Как ключ, вы можете угадать универсальный тип, изучив содержимоеиз List, поиск наиболее определенного общего суперкласса с помощью отражения.

0 голосов
/ 03 августа 2010

Как правило, вы бы подкласса этого типа, чтобы дать конкретный тип, а затем обработка пакетов должна быть в состоянии правильно разрешить тип.В качестве альтернативы многие пакеты имеют концепцию ссылки на тип некоторого вида («токен типа»), который просто использует анонимный класс для предоставления информации о типе, чтобы десериализатор мог правильно вывести намеченный тип;Я не помню, какой класс Gson использует бит, он должен иметь что-то вроде этого.

Если у вас есть только экземпляр времени выполнения, то вам не повезло, за исключением наличия непустого списка.и проверка его типа (как предложено).

...