到目前为止,我成功地使用了 Google Guice 2。在迁移到 Guice 3.0 时,我遇到了关于 assisted inject factories 的问题。假设有以下代码:
public interface Currency {}
public class SwissFrancs implements Currency {}
public interface Payment<T extends Currency> {}
public class RealPayment implements Payment<SwissFrancs> {
@Inject
RealPayment(@Assisted Date date) {}
}
public interface PaymentFactory {
Payment<Currency> create(Date date);
}
public SwissFrancPaymentModule extends AbstractModule {
protected void configure() {
install(new FactoryModuleBuilder()
.implement(Payment.class, RealPayment.class)
.build(PaymentFactory.class));
}
}
创建注入器时,我遇到以下异常:
com.google.inject.CreationException: Guice creation errors:
1) Payment<Currency> is an interface, not a concrete class.
Unable to create AssistedInject factory. while locating Payment<Currency>
at PaymentFactory.create(PaymentFactory.java:1)
使用Guice 2的辅助注入创建器,我的配置可以正常工作:
bind(PaymentFactory.class).toProvider(
FactoryProvider.newFactory(PaymentFactory.class, RealPayment.class));
到目前为止,我找到的唯一解决方法是从工厂方法的返回类型中删除泛型参数。
public interface PaymentFactory {
Payment create(Date date);
}
有没有人知道为什么Guice 3不喜欢工厂方法中的泛型参数,或者我对辅助注入工厂的理解有什么误解?谢谢!
TypeLiteral<Payment<Currency>>
传递给implement
而不是Payment.class
? - JeremyTypeLiteral
没有公共构造函数,如果你使用TypeLiteral.get(Payment.class)
,你会得到相同的异常。 - kraftanTypeLiteral.get(Types.newParameterizedType(Payment.class, Currency.class));
- Jeremynew TypeLiteral<Payment<Currency>>(){}
。 注意{}
…必须创建子类以使完整的通用信息可用。 - ColinDTypeLiteral
和implement
方法时存在类型不匹配的问题。 - kraftanimplement
方法的类型不匹配。 - kraftan