は、私はクラスが定義されています。 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<>(){};
この新しい 'TypeToken>(){{}} .getType();'はあなたの考えをしません。対応する 'Type'は推論される型ではなく、型変数' T'を反映します。 –
タイプ・トークンをジェネリック・タイプ・パラメータでインスタンス化すると、実行時に(クラス情報を除いて) 'T'が存在しないため、あまり役に立ちません。そこに型トークンをインスタンス化するのではなく、どこからでも(例えば 'Calls'コンストラクタを介して)それを委譲して、_callサイト_に型トークンをインスタンス化する必要があります。 'stringHandlerResponseType = new TypeToken>(){}。getType()'と '新しい呼び出し(stringHandlerResponseType)'です。今は_real_型を持っていることに注意してください。ちなみに、あなたはタイプミスがあります: '{{}}'は '{}'でなければなりません。 –
あなたは正しい@LyubomyrShaydarivの正しい使用法iを '{}'とします(この[例]のように(https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google /gson/reflect/TypeToken.html))、私が提案した通りに、コンストラクタでTypeTokenオブジェクトを移動したところ、これが動作します。 – genesisxyz