使用Guava检查泛型类

时间:2013-06-03 16:23:20

标签: java generics reflection guava

我知道我在这里所呈现的不好但仍然 - 我需要这样做...... 我想在给定的方法中检查泛型类。我尝试使用Guava和来自这里的描述:https://code.google.com/p/guava-libraries/wiki/ReflectionExplained#Introduction 这是我所拥有的,我不完全理解为什么它不起作用: ```

abstract static public class IKnowMyType<T> {
    public TypeToken<T> type = new TypeToken<T>(getClass()) {};
}

protected <P> void abc(P el){
    System.out.println(new IKnowMyType<P>(){}.type);
}

protected <P> void abc(){
    System.out.println(new IKnowMyType<P>(){}.type);
}

void test(){
    System.out.println(new IKnowMyType<String>(){}.type); // -> java.lang.String
    this.abc("AA"); // -> P
    this.<String>abc(); // -> P
}

我想得到的是P(本例中为字符串)而不是P的正确类。这该怎么做?为什么那些abc方法不能按预期工作?

1 个答案:

答案 0 :(得分:4)

没有办法做你想要做的事情,而这正如预期的那样。

类型擦除在运行时销毁对象的泛型类型信息,以及方法类型参数的知识(就像你在这里找到的那​​样)。什么类型的擦除不影响的是类知道它们的编译时泛型类型,例如如果你有

class Foo<T> {}

class Bar extends Foo<String>

然后Bar.class知道它是Foo<String>的子类,而不仅仅是Foo。这就是TypeToken的工作原理,但它只适用于在编译时修复类型的情况。它不能保留为类型变量。