Guice:为什么TypeLiteral <t> getRawType()方法返回Class <! - ?超级T - >而不是Class <t>?

时间:2017-08-26 11:27:53

标签: java generics guice

我想使用Guice类型文字内置注入,因为我需要注入类信息。请参阅以下示例:

public class Foo<T> {

    private Class<T> clazz;

    @Inject
    public Foo(TypeLiteral<T> literal) {
        this.clazz = literal.getRawType();
    }
}

它会完美运行,但getRawType()方法会返回Class<? super T>。内部clazz变量被用作另一个类的方法的参数。 如果我将clazz类型修改为Class<? super T>,我将不得不重做一堆类。

这里最优雅的解决方案是什么?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以将原始类型转换为Class<T>,但最终可能会将其取消选中,如下所示:

@Inject
public Foo(TypeLiteral<T> literal) {
    this.clazz = (Class<T>) literal.getRawType();
}

为了回答你的问题,为什么会这样做,Why does Guava's TypeToken<T>.getRawType() return Class<? super T> instead of Class<T>有类似的答案。这是一个很好的例子作为答案。