До сих пор я успешно использовал Google Guice 2. При переходе на Guice 3.0 у меня были проблемы с фабриками вспомогательных инъекций. Предположим, следующий код
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 не нравится универсальный параметр в фабричном методе или что я обычно неправильно понимаю на фабриках вспомогательных инъекций? Спасибо!