2

我知道我在这里展示的内容很糟糕,但仍然 - 我需要这样做......我想检查给定方法中的泛型类。我尝试从这里使用 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方法不能按我的预期工作?

4

1 回答 1

6

没有办法做你想做的事,这完全符合预期。

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

class Foo<T> {}

class Bar extends Foo<String>

然后Bar.class知道它是 的子类Foo<String>,而不仅仅是Foo。这就是TypeToken工作原理,但它仅在类型在编译时固定时才有效;它不能作为类型变量保留。

于 2013-06-03T16:43:29.570 回答