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泛型常见问题解答了很多的更多信息.