在Java中键入Erasure

DD.*_*DD. 5 java generics type-erasure

类型擦除应该删除所有通用信息...如果是这种情况,像GSON这样的库如何使用泛型来确定要反序列化的类型?

例如

private Map<String,Date> tenordates;
Run Code Online (Sandbox Code Playgroud)

这将反序列化到<String,Date> as

private Map<Date,Date> tenordates;
Run Code Online (Sandbox Code Playgroud)

将反序列化为 <Date,Date>

所以不知何故它在运行时使用通用信息.

Boz*_*zho 5

类型擦除不会删除所有类型信息.它不会从类,字段,返回类型和参数定义中删除它.保留以下示例中的类型信息:

public class Foo extends List<Bar> { ..}

private List<Foo> foos;

public List<Foo> getFoos() {..}

public void doSomething(List<Foo> foos) {..}
Run Code Online (Sandbox Code Playgroud)

这可以通过反射来访问 - java.lang.reflect.ParameterizedType.您可以检查给定Type是否instanceof是该类,强制转换为它并获取类型信息.