我知道我在这里展示的是不好的,但我仍然需要这样做…我想检查类的泛型在给定的方法。我尝试使用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
方法不工作,因为我的期望?
没有办法做你想做的事情,这是完全按照预期的工作。
类型擦除在运行时销毁对象的泛型类型信息,以及方法的类型参数的知识(就像您在这里发现的那样)。类型擦除不影响的是类知道它们的编译时泛型,因此,例如,如果你有
class Foo<T> {}
class Bar extends Foo<String>
则Bar.class
知道它是Foo<String>
的子类,而不仅仅是Foo
。这就是TypeToken
的工作原理,但它只在编译时类型固定时起作用;不能留作类型变量