tyn*_*ynn 10 java generics android gson typetoken
我正在TypeAdapter为两个依赖的通用模型实现一个Gson .
interface ModelA<T> {}
interface ModelB<T> extends ModelA<List<T>> {}
Run Code Online (Sandbox Code Playgroud)
为此,我需要得到TypeToken和TypeAdapter.通过做
Type type = ((ParameterizedType) type).getActualTypeArguments()[0];
TypeToken<?> token = TypeToken.get(type);
TypeAdapter<?> adapter = gson.getAdapter(token);
Run Code Online (Sandbox Code Playgroud)
我得到任何给定类型的模型AnyType和相关适配器的类型标记.这是我需要的ModelA,但是因为ModelB我需要使用适配器List<AnyType>,这是ModelA<List<AnyType>>直接使用的结果.
使用原始类型标记的原始类型的接口传递
token.getRawType().getGenericInterfaces()[0]
Run Code Online (Sandbox Code Playgroud)
我似乎只是得到了类型擦除类型List.
如何组合这两个信息以获取泛型List<AnyType>类型或直接创建它?作为输入,它只有类型标记ModelB<AnyType>.
对于给定的行为,我实现了一个显示差异的简单测试.我使用Gson内部非API类expected从hahn的答案中获取了部分内容$Gson$Types.
public class TypeTokenValidate {
public interface ModelA<T> {}
public interface ModelB<T> extends ModelA<List<T>> {}
@Test
public void genericToken() throws Exception {
TypeToken<ModelB<String>> token = new TypeToken<ModelB<String>>() {};
ModelB<String> m = new ModelB<String>() {};
Type expected = $Gson$Types.resolve(ModelB.class, m.getClass(),
ModelA.class.getTypeParameters()[0]);
assertEquals(expected, getActual(token));
}
private static Type getActual(TypeToken<?> token) {
Type type = token.getType();
//type = token.getRawType().getGenericInterfaces()[0];
type = ((ParameterizedType) type).getActualTypeArguments()[0];
return TypeToken.get(type).getType();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用.getType()而不是.getRawType()您正在查找的信息似乎被保留:
import java.util.List;
import java.lang.reflect.ParameterizedType;
import com.google.gson.reflect.TypeToken;
public class Test {
public interface ModelA<T> {};
public interface ModelB<T> extends ModelA<List<T>> {}
public static void main(String[] args) {
// Using java.lang.reflect.*:
System.out.println(ModelB.class.getGenericInterfaces()[0]);
// out: Test.Test$ModelA<java.util.List<T>>
System.out.println(((ParameterizedType)ModelB.class.getGenericInterfaces()[0]).getActualTypeArguments()[0]);
// out: java.util.List<T>
System.out.println(((ParameterizedType)((ParameterizedType)ModelB.class.getGenericInterfaces()[0]).getActualTypeArguments()[0]).getActualTypeArguments()[0]);
// out: T
// Recovery from a TokenType instance...
// ... using .getRawType()
System.out.println(TypeToken.get(ModelB.class.getGenericInterfaces()[0]).getRawType());
// out: interface Test$ModelA
System.out.println(TypeToken.get(((ParameterizedType)((ParameterizedType)ModelB.class.getGenericInterfaces()[0]).getActualTypeArguments()[0])).getRawType());
// out: interface java.util.List
// ... using .getType()
System.out.println(TypeToken.get(ModelB.class.getGenericInterfaces()[0]).getType());
// out: Test$ModelA<java.util.List<T>>
System.out.println(TypeToken.get(((ParameterizedType)((ParameterizedType)ModelB.class.getGenericInterfaces()[0]).getActualTypeArguments()[0])).getType());
// out: java.util.List<T>
}
}
Run Code Online (Sandbox Code Playgroud)
TokenAdaptors希望您能从那里弄清楚如何创建您的。
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |