如何从任何使用Guava的方法获取返回类型?

时间:2015-02-26 16:57:00

标签: java reflection guava

我从official Guava's TypeToken wiki了解到的是,即使由type argument定义,我们也可以获得方法的返回类型。但我无法设法检索返回的Method类型。

如果我有一个实例List<String>,我怎样才能从String.class方法而不是get()获取E

我知道Java在编译时会输入类型擦除(即在运行时期间类型参数不可用)。也许我错了,Guava无法从实例类中检索预期类型的​​方法...

2 个答案:

答案 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类型的对象。