Получить имя универсального типа во время компиляции для аннотации

Рассмотрим этот общий класс:

public class ListHolder<T> {
  private List<T> objects;
  [...] // non relevant fields
}

Я использую Gson для десериализации ответа JSON от API REST. Все списки объектов в API выглядят так:

{"clients":[{"id":6493557,"name":"test", [..]}, {"id":6493557, 
[..]}]}

{"users":[{"id":6493557,"name":"test", [..]}, {"id":6493557, 
[..]}]}

Проблема в том, что хотя структура ответов одинакова, ключевое слово, с которого начинается список, имеет имя объекта предметной области. Gson использует имя поля в качестве ключевого слова или дополнительную аннотацию @SerializedName, но я не знаю, как получить имя T во время компиляции.

Я знаю, что это невозможно получить во время выполнения из-за стирания типа, но аннотации в любом случае нужна константа времени компиляции, и компилятор действительно имеет эту информацию во время компиляции.

Я хотел бы использовать ListHolder<Client> и ListHolder<User>, которые сработали бы, если бы я мог сделать это:

public class ListHolder<T> {
  @SerializedName(nameof(T).toLowerCase() + "s")
  private List<T> objects;
  [...] // non relevant fields
}

nameof() существует? Есть ли другой способ решить эту проблему? Вероятно, я могу решить эту проблему с помощью TypeAdapters и настройки десериализации, но мне кажется, что это будет не очень приятно.


person Marco Nembrini    schedule 14.02.2018    source источник