Enlazar list de objects usando Guice + Kotlin

Estoy escribiendo una aplicación JavaFX en Kotlin con la siguiente definición de controller:

class MainController { @Inject private lateinit var componentDescriptors: List<ComponentDescriptor> /* More code goes here */ } 

Estoy usando la administración de Guice for Dependency. Y estoy tratando de insert la list de instancias de classs cargadas a través de java.util.ServiceLoader . Mi problema es definir un enlace que inyecte la list de instancias de objects cargados en el campo declarado. Intenté el aprovisionamiento basado en annotations:

 internal class MyModule: AbstractModule() { override fun configure() { } @Provides @Singleton fun bindComponentDescriptors(): List<ComponentDescriptor> = ServiceLoader.load(ComponentDescriptor::class.java).toList() } 

y extensión de multibinding (conmutada List to Set en la definición de campo de corse):

 internal class MyModule: AbstractModule() { override fun configure() { val componentDescriptorBinder = Multibinder.newSetBinder(binder(), ComponentDescriptor::class.java) ServiceLoader.load(ComponentDescriptor::class.java).forEach { componentDescriptorBinder.addBinding().toInstance(it) } } } 

pero ambos enfoques conducen al mismo error:

 No implementation for java.util.List<? extends simpleApp.ComponentDescriptor> was bound. while locating java.util.List<? extends simpleApp.ComponentDescriptor> for field at simpleApp.MainController.componentDescryptors(MainController.kt:6) while locating simpleApp.MainController 1 error at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1042) at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1001) at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051) at com.gluonhq.ignite.guice.GuiceContext.getInstance(GuiceContext.java:46) at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:929) at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971) at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220) at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744) at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) ... 12 more 

Estoy empezando a sospechar que de alguna manera está relacionado con la varianza gerenica de Kotlin y la comprobación estricta de types de Guice. Pero no sé cómo declarar el enlace, así que Guice sabrá qué inyectar en este campo.

Sí, sucede debido a la variación, pero hay una manera de hacerlo funcionar.

 class MainController { @JvmSuppressWildcards @Inject private lateinit var componentDescriptors: List<ComponentDescriptor> } 

Por defecto, Kotlin genera List<? extends ComponentDescriptor> List<? extends ComponentDescriptor> signature para el campo componentDescriptors . El @JvmSuppressWildcards hace generar una firma simple parametrizada List<ComponentDescriptor> .

@Michael da la respuesta correcta y la explicación. Aquí hay un ejemplo de una estrategia para probar unidades. Set multibinding para aquellos que les gusta probar sus modules:

 class MyModuleTest { @JvmSuppressWildcards @Inject private lateinit var myTypes: Set<MyType> @Before fun before() { val injector = Guice.createInjector(MyModule()) injector.injectMembers(this) } @Test fun multibindings() { assertNotNull(myTypes) assertTrue(myTypes.iterator().next() is MyType) } } 
  • Gradle Build falla con el nuevo Gradle 3.0.0
  • Referencia no resuelta de Kotlin en time de compilation
  • Kotlin cuando con valores múltiples no funciona cuando el valor es una vista de Android
  • ¿Cómo implementar la fórmula de Stirling con BigDecimal y BigInteger en Kotlin?
  • Ejecutar testings desde Android Studio IDE no reconstruye el module de biblioteca Java puro
  • Los methods de logging de Anko no se pueden resolver
  • Usar la habitación como singleton en kotlin
  • Kotlin `shl` no funciona
  • Agregar un interceptor a un cliente okHttp3 ya construido
  • ¿Qué significa "con" en Kotlin?
  • Emitir cualquiera a Matriz en Kotlin