我从official Guava's TypeToken
wiki了解到的是,即使由type argument定义,我们也可以获得方法的返回类型。但我无法设法检索返回的Method
类型。
如果我有一个实例List<String>
,我怎样才能从String.class
方法而不是get()
获取E
?
我知道Java在编译时会输入类型擦除(即在运行时期间类型参数不可用)。也许我错了,Guava无法从实例类中检索预期类型的方法...
答案 0 :(得分:2)
如果您可以获得TypeToken<List<String>>
,则可以获取其get
方法的返回类型(如示例所示)。但是如果你有一些任意的List<?>
实例,你将无法获得表示该列表实际类型的TypeToken
(例如List<String>
),因为该信息不存在于运行时。
答案 1 :(得分:-1)
正如ColinD和Louis Wasserman所提到的,泛型类型擦除不会删除有关超类的泛型类型信息。 Here也是一篇有趣的博客文章。
诀窍是扩展一个声明泛型类型的类。这允许使用getGenericSuperclass()
来检索泛型类型信息。
private static class AnyClassWithGenerics<A, B, C> {
}
private static class SomeObject extends AnyClassWithGenerics<String, Number, ArrayList<Integer>> {
}
public static void main(String[] args) throws Exception {
Type genericSuperclass = SomeObject.class.getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedTypeImpl) {
for (Type type : ((ParameterizedTypeImpl) genericSuperclass).getActualTypeArguments()) {
System.out.println(type);
}
}
}
上面的代码产生了这个结果:
class java.lang.String
class java.lang.Number
java.util.ArrayList<java.lang.Integer>
唯一令人遗憾的是演员而且我没有调查getGenericSuperclass()
在什么条件下返回ParameterizedTypeImpl
类型的对象。