我知道我在这里所呈现的不好但仍然 - 我需要这样做...... 我想在给定的方法中检查泛型类。我尝试使用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
方法不能按预期工作?
答案 0 :(得分:4)
没有办法做你想要做的事情,而这正如预期的那样。
类型擦除在运行时销毁对象的泛型类型信息,以及方法类型参数的知识(就像你在这里找到的那样)。什么类型的擦除不影响的是类知道它们的编译时泛型类型,例如如果你有
class Foo<T> {}
class Bar extends Foo<String>
然后Bar.class
知道它是Foo<String>
的子类,而不仅仅是Foo
。这就是TypeToken
的工作原理,但它只适用于在编译时修复类型的情况。它不能保留为类型变量。