我有一个泛型类。我正在尝试注入这个类,它似乎没有工作。我发现的其他解决方案违背了泛型的全部要点,因为建议对模块中的类型进行硬编码。
@Override
protected void configure() {
this.bind(new TypeLiteral<IServiceClient<Object>>(){}).to(new TypeLiteral<ServiceClient<Object>>(){});
}
用法
@Inject IServiceClient<Customer> customerServiceClient
;
答案 0 :(得分:0)
类型参数通常是Key
的有用部分(它本身仅由TypeLiteral
和绑定注释组成)。 Guice预计您会希望将IServiceClient<User>
和IServiceClient<Property>
视为两个不同的绑定,因此您可以使用两种不同的实现轻松实现它们。听起来你的情况不那么具体,你希望MyService<Foo>
绑定到任何Foo
的同一个实现类。
根源Guice是从键到提供者的映射,因此在单个语句中绑定各种键并不是一件容易的事。当然,您可以遍历您打算支持的IServiceProvider
的不同类型参数,将每个参数分开绑定,但看起来这是您预期的“反对泛型的整个点”的解决方案。 (我不同意它已经超越了这一点,但是如果你支持广泛的类作为参数,那么同意循环有点笨拙。)
因为泛型是通过擦除处理的,所以更好的选择可能是绑定实现类一次并将其转换为类的构造函数:
class MyConsumer {
IServiceProvider<Foo> fooServiceProvider;
@SuppressWarnings("unchecked")
@Inject
MyConsumer(IServiceProvider<?> fooServiceProvider) {
this.fooServiceProvider = (IServiceProvider<Foo>) fooServiceProvider;
}
}
这样Guice会反射性地寻找相同的IServiceProvider
实现,无论你打算使用什么类型,你都可以自己安全地投射它。如果发现警告很丑,你可以用静态方法包装演员。