2017-01-09 5 views
1

は、私はクラスが定義されています。 HandlerResponseは以下のような属性を含む単純なモデルクラスであるGson違法型変数参照

java.lang.reflect.Type type = new TypeToken<HandlerResponse<T>>(){{}}.getType(); 

private Map detail; 

private transient T data; 

private transient int count = 0; 

private String status; 

私はAndroidのメーカーに乗るの例外がある:TypeTokenのインスタンス化で

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) 

クラッシュ(おそらくTクラスのJavaの型削除の原因を失っていると思っていた)。

私はとしてCallsのインスタンスを作成する:

public class Calls<T> { 

    public Calls(Type type, Class classTypeResponse) { 

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

    doRequest(...) { ... } 

    ... 
} 

私は右のクラスを返すコールバック・システムを持っているので、私はclassTypeResponseを有する:

Calls<com.company.model.beans.Model> calls = new Calls<>(){}; 
+1

この新しい 'TypeToken >(){{}} .getType();'はあなたの考えをしません。対応する 'Type'は推論される型ではなく、型変数' T'を反映します。 –

+1

タイプ・トークンをジェネリック・タイプ・パラメータでインスタンス化すると、実行時に(クラス情報を除いて) 'T'が存在しないため、あまり役に立ちません。そこに型トークンをインスタンス化するのではなく、どこからでも(例えば 'Calls'コンストラクタを介して)それを委譲して、_callサイト_に型トークンをインスタンス化する必要があります。 'stringHandlerResponseType = new TypeToken >(){}。getType()'と '新しい呼び出し(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

が解決以下のように、私が実装修飾しました要求のオブジェクトのタイプ。

私はこの方法でそれを呼び出す:Tが実行時に存在しません

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(...); 

、JavaリフレクションシステムはTypeTokenのための右の種類を推測することができませんでした。解決策は、ジェネリックスなしでTypeTokenを作成し、必要な場所にオブジェクトを渡すことです。

+1

ところで、 'T extends Object 'は常に' 'オブジェクトによって拡張することを意味するので' 'T extends Object>'を単に ''と書くことができます。 –

+1

@LyubomyrShaydarivはい、それは問題を解決しようとしていたときにそこにとどまっていたものです。 – genesisxyz

関連する問題