使用gson反序列化时,将TypeToken转换为Type时出错

din*_*igo 7 java eclipse generics casting gson

我有一个类使用此函数反序列化泛型的ArrayList,正如此线程的第一个答案所述:Java抽象类函数泛型类型

public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data,   TypeToken.get(new ArrayList<T>().getClass()));
}
Run Code Online (Sandbox Code Playgroud)

Eclipse要求我强制转换TypeToken导致这个(函数fromJson需要一个Type,而不是TypeToken)

public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data,  (Type) TypeToken.get(new ArrayList<T>().getClass()));
}
Run Code Online (Sandbox Code Playgroud)

结果我得到这个错误:

java.lang.ClassCastException: com.google.gson.reflect.TypeToken cannot be cast to java.lang.reflect.Type
Run Code Online (Sandbox Code Playgroud)

gson用户手册中,他们告诉您这是调用该函数的正确方法

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);
Run Code Online (Sandbox Code Playgroud)

我无法看到我做错了什么(如果它是一个有效的答案,为什么我得到这个演员错误?)

Jon*_*eet 10

那么你正在打电话TypeToken.get,它会返回一个TypeToken- 而不是一个Type.在示例中,您将显示哪些有效,它正在使用TypeToken.getType(),它返回一个Type.

所以你可以使用:

return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()).getType());
Run Code Online (Sandbox Code Playgroud)

......那会让你回归Type,但它可能不是你真正想要的.特别是,由于类型擦除,无论T您在呼叫站点中指定了什么类型,都会返回相同的类型.如果你想要真正反映类型ArrayList<T>,你需要将类传递给方法,虽然我不完全确定从那里去的地方.(根据我的经验,Java反射API在泛型方面并不十分清楚.)

顺便说一句,我希望一个叫做arrayType数组有关的方法,而不是ArrayList.