1

我有一个泛型类型类。我正在尝试注入此类,但它似乎不起作用。我发现的其他解决方案违背了拥有泛型的全部意义,因为建议对模块中的类型进行硬编码。

@Override
protected void configure() {

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



}

用法

@Inject IServiceClient<Customer> customerServiceClient;

4

1 回答 1

0

通常情况下,类型参数是一个有用的部分Key(它本身只由一个TypeLiteral和一个绑定注释组成)。Guice 预计您会希望将IServiceClient<User>IServiceClient<Property>视为两个不同的绑定,因此您可以使用两种不同的实现轻松实现它们。听起来您的情况不太具体,您希望MyService<Foo>为 any 绑定到相同的实现类Foo

从根本上说,Guice 是从键到提供者的映射,因此在单个语句中绑定多种键并不容易。当然,您可以遍历IServiceProvider您打算支持的不同类型参数,分别绑定每个参数,但这似乎是您预期的“反对泛型的全部要点”的解决方案。(我不同意这已经过时了,但同意如果您支持广泛的类作为参数,循环有点笨拙。)

因为泛型无论如何都是通过擦除来处理的,更好的选择可能是绑定一次实现类并将其强制转换到类的构造函数中:

class MyConsumer {
  IServiceProvider<Foo> fooServiceProvider;

  @SuppressWarnings("unchecked")
  @Inject
  MyConsumer(IServiceProvider<?> fooServiceProvider) {
    this.fooServiceProvider = (IServiceProvider<Foo>) fooServiceProvider;
  }
}

这样,无论您想要什么类型,Guice 都会反思性地寻找相同的IServiceProvider实现,并且您可以自己安全地转换它。如果您发现警告很难看,您可以将演员表包装在静态方法中。

于 2013-01-28T04:38:13.370 回答