Google Guice +仿制药:窗帘背后是否有一些魔力?

Pio*_*zyk 4 java generics guice

在我看来,Guice实现在处理泛型时做了一些非常棘手的事情.看起来它在运行时知道编译时使用的泛型类型.让我们看一个简单的例子:

@Inject
public void Bar(Provider<Foo> genericInjector){
...
Run Code Online (Sandbox Code Playgroud)

在运行时,Guice将在Provider此处注入正确的实现(即提供Foo实例的实现).但据我所知,泛型类型在运行时被擦除(参见:Type Erasure).所以Guice在运行时真正看到的是:

@Inject
public void Bar(Provider genericInjector){
....
Run Code Online (Sandbox Code Playgroud)

那么Guice怎么可能知道Provider要注入哪个实现呢?

Jon*_*eet 11

不,类型擦除不会删除所有内容.你仍然可以得到字段类型,参数等的Provider<Foo>信息仍然存在的执行时间.Method.getGenericParameterTypes例如,参见.

什么是不保留是关于特定对象类型的信息.例如,如果我写:

List<String> list = new ArrayList<String>();
showType(list);

...


public static void showType(List<?> list)
{
    // ???
}
Run Code Online (Sandbox Code Playgroud)

没有办法可以解决它是ArrayList<String>因为对象不再具有该信息.

Java泛型常见问题解答很多的更多信息.