У меня есть класс, определенный как:Gson недопустимого типа переменной ссылка
public class Calls<T extends Object>
Внутри этого класса есть метод doRequest
, что создает TypeToken
(от com.google.json.reflect
) для запроса Gson.
java.lang.reflect.Type type = new TypeToken<HandlerResponse<T>>(){{}}.getType();
где HandlerResponse
простая модель класса, который содержит атрибуты, как:
private Map detail;
private transient T data;
private transient int count = 0;
private String status;
за исключением лажу Android Studio является:
FATAL EXCEPTION: main
Process: PID: 32628
java.lang.AssertionError: illegal type variable reference
at libcore.reflect.TypeVariableImpl.resolve(TypeVariableImpl.java:111)
at libcore.reflect.TypeVariableImpl.getGenericDeclaration(TypeVariableImpl.java:125)
at libcore.reflect.TypeVariableImpl.hashCode(TypeVariableImpl.java:47)
at java.util.Arrays.hashCode(Arrays.java:4153)
at com.google.gson.internal.$Gson$Types$ParameterizedTypeImpl.hashCode($Gson$Types.java:479)
at com.google.gson.reflect.TypeToken.<init>(TypeToken.java:64)
at com.company.server.Calls$4.<init>(Calls.java:244)
аварии на инстанциации TypeToken (Я думал, что, вероятно, потеряет класс T, вызывающий стирание типа Java.
Я создаю экземпляр Calls
как:
Calls<com.company.model.beans.Model> calls = new Calls<>(){};
Этот 'новый TypeToken>() {{}}. GetType();' не будет делать то, что вы думаете. Соответствующий 'Type' будет отображать переменную типа' T', а не тип. –
Когда вы создаете экземпляр типа с параметром общего типа, это не поможет вам, потому что 'T' не существует во время выполнения (кроме информации о классе). Вам не нужно создавать экземпляр типа прямо там, но делегировать его где-то (например, через конструктор 'Calls'), тем самым создавая экземпляр типа на сайте _call_, например. 'Тип stringHandlerResponseType = new TypeToken>() {}. GetType()' и 'new Calls (stringHandlerResponseType)'. Обратите внимание, что теперь у вас есть тип _real_. Кстати, у вас есть опечатка: '{{}}' должен быть просто '{}'. –
Вы правильно @LyubomyrShaydariv правильное использование i с '{}' (как в этом [пример] (https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google /gson/reflect/TypeToken.html)), и я сделал то, что вы предложили, я переместил объект TypeToken в конструктор, и теперь он работает. – genesisxyz