2017-01-09 2 views
1

У меня есть класс, определенный как: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<>(){}; 
+1

Этот 'новый TypeToken >() {{}}. GetType();' не будет делать то, что вы думаете. Соответствующий 'Type' будет отображать переменную типа' T', а не тип. –

+1

Когда вы создаете экземпляр типа с параметром общего типа, это не поможет вам, потому что 'T' не существует во время выполнения (кроме информации о классе). Вам не нужно создавать экземпляр типа прямо там, но делегировать его где-то (например, через конструктор 'Calls'), тем самым создавая экземпляр типа на сайте _call_, например. 'Тип stringHandlerResponseType = new TypeToken >() {}. GetType()' и 'new Calls (stringHandlerResponseType)'. Обратите внимание, что теперь у вас есть тип _real_. Кстати, у вас есть опечатка: '{{}}' должен быть просто '{}'. –

+0

Вы правильно @LyubomyrShaydariv правильное использование i с '{}' (как в этом [пример] (https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google /gson/reflect/TypeToken.html)), и я сделал то, что вы предложили, я переместил объект TypeToken в конструктор, и теперь он работает. – genesisxyz

ответ

1

решаемые, я изменил реализацию следующим образом:

public class Calls<T> { 

    public Calls(Type type, Class classTypeResponse) { 

     this.type = type; 
     this.classTypeResponse = classTypeResponse; 
    } 

    doRequest(...) { ... } 

    ... 
} 

У меня есть classTypeResponse, потому что у меня есть система обратного вызова, которая возвращает правильный класс тип объекта для запроса.

Я называю это следующим образом:

Type type = new TypeToken<HandlerResponse<com.company.model.beans.Model>>(){}.getType(); 

Calls<com.company.model.beans.Model> calls = new Calls<>(type, com.company.model.beans.Model.class); 

calls.doRequest(...); 

T не существует во время выполнения, система отражения Java не может вывести правильный тип для TypeToken. Решение состоит в том, чтобы создать TypeToken без дженериков и передать объект, в котором он вам нужен.

+1

Кстати, вы можете записать '' просто как '', потому что 'T' всегда подразумевает« расширение по объекту ». –

+1

@LyubomyrShaydariv да, это то, что оставалось там, когда я пытался решить проблему. – genesisxyz

Смежные вопросы