Generics Guice、泛型和typeliteral
假设我有这个:Generics Guice、泛型和typeliteral,generics,guava,guice,typeliteral,Generics,Guava,Guice,Typeliteral,假设我有这个: public class Foo<T> { @Inject public Foo(Class<T> tClass); } public class FooProvider<T> implements Provider<Foo<T>> { @Inject private TypeLiteral<T> type; @Override public Foo<T> get
public class Foo<T> {
@Inject public Foo(Class<T> tClass);
}
public class FooProvider<T> implements Provider<Foo<T>> {
@Inject private TypeLiteral<T> type;
@Override
public Foo<T> get() {
Class<T> rawType = (Class<T>) type.getRawType();
return new Foo<>(rawType);
}
}
它会自动绑定Foo
、Foo
等,还是必须单独提供它们?还假设我不能修改Foo
,因此它采用TypeLiteral
而不是类
相关问题:假设我有Guava的TypeToken
(或其他类似的“TypeToken”类),我有一个提供者可以将TypeLiteral
转换为TypeToken
。类似的原理会起作用吗?给定的绑定
bind(Foo.class).toProvider(FooProvider.class);
将只将类“Foo”(不指定泛型类型)绑定到提供程序。您需要使用TypeLiteral来指定泛型。您可以通过以下语句获得所需的行为:
bind(new TypeLiteral<Foo>(){}).toProvider(FooProvider.class);
bind(newtypeliteral(){}).toProvider(FooProvider.class);
试试这个:
类别:
public class Foo<T> {
@Inject public Foo(Class<T> tClass);
}
公共类Foo{
@注入公共Foo(类tClass);
}
我猜您希望JIT在注入类时自动提供泛型类型,但这不会发生。Guice的JIT不是这样工作的。您需要绑定计划使用的每个泛型类型。请参阅以下代码片段(请注意,我们没有绑定Foo,而是绑定将被注入Foo的类):
bind(newtypeliteral(){}).toInstance(MyType.class);
要获取实例,需要将类型定义为泛型
@Inject Foo<MyType> foo
@injectfoo-Foo
要直接从注入器轮询它,需要具体说明泛型类型
injector.getInstance(Key.get((new TypeLiteral<Foo<MyType>>(){})));
injector.getInstance(Key.get((new-TypeLiteral(){}));
为什么不自己试试呢?IMO guice在处理泛型方面做得很差。有时,正确绑定泛型似乎是一个非常漫长的过程,但仍然顽固地拒绝为我编译。表示不能将FooProvider.class
转换为ClassI我认为这个答案解决了问题的实质,但并不能解决您的问题。请参阅我的其他答案以解决您的问题。
@Inject Foo<MyType> foo
injector.getInstance(Key.get((new TypeLiteral<Foo<MyType>>(){})));