Он преобразует строку JSON в List набор объектов. Но теперь я хочу иметь это ArrayList с динамическим типом (не только myClass), определенным во время выполнения.
Тип элемента ArrayList будет определен с помощью отражения.
недопустимо, потому что вы пытаетесь передать вызов метода, в котором ожидается имя типа.
Следующее
newTypeToken<ArrayList<T>>()
это невозможно из-за того, как работают дженерики (стирание типов) и отражение. Весь TypeToken хак работает, потому что Class#getGenericSuperclass() выполняет следующее
Возвращает тип, представляющий прямой суперкласс сущности (класса, интерфейса, примитивного типа или void), представленной этим классом.
Если суперкласс является параметризованным типом, возвращаемый объект типа должен точно отражать фактические параметры типа, используемые в исходном коде.
Другими словами, если он увидит ArrayList<T>, это ParameterizedType он вернет, и вы не сможете извлечь значение времени компиляции, которое имела бы переменная типа T.
С kotlin вы можете использовать приведенные ниже функции для преобразования (из / в) любого (JSONArray / JSONObject) всего в одной строке без необходимости отправлять TypeToken :-
Преобразуйте любой класс или массив в строку JSON
inline fun <reified T : Any> T?.json() = this?.let { Gson().toJson(this, T::class.java) }