Android& Guice - 注入通用类型的类?

时间:2013-01-28 03:34:32

标签: java android generics guice roboguice

我有一个泛型类。我正在尝试注入这个类,它似乎没有工作。我发现的其他解决方案违背了泛型的全部要点,因为建议对模块中的类型进行硬编码。

@Override
protected void configure() {

    this.bind(new TypeLiteral<IServiceClient<Object>>(){}).to(new TypeLiteral<ServiceClient<Object>>(){});



}

用法

@Inject IServiceClient<Customer> customerServiceClient;

1 个答案:

答案 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实现,无论你打算使用什么类型,你都可以自己安全地投射它。如果发现警告很丑,你可以用静态方法包装演员。