Привязать список объектов, используя Guice + Kotlin

Я пишу приложение JavaFX в Kotlin со следующим определением контроллера:

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

Я использую Guice for Dependency management. И я пытаюсь ввести список экземпляров классов, загруженных через java.util.ServiceLoader . Моя проблема заключается в определении привязки, которая введет список загруженных объектов объекта в объявленное поле. Я пробовал подготовку на основе аннотаций:

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

и многосвязное расширение (с помощью переключателя List to Set в полевом определении 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) } } } 

но оба этих подхода приводят к той же ошибке:

 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 

Я начинаю подозревать, что это как-то связано с дисперсией Kotlin gerenic и строгой проверкой типа Guice. Но я не знаю, как объявить привязку, поэтому Гийс будет знать, что нужно вводить в эту область.

Да, это происходит из-за различия, но есть способ заставить его работать.

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

По умолчанию Kotlin генерирует List<? extends ComponentDescriptor> List<? extends ComponentDescriptor> подпись List<? extends ComponentDescriptor> для поля componentDescriptors . @JvmSuppressWildcards позволяет генерировать простой параметризованный List<ComponentDescriptor> @JvmSuppressWildcards List<ComponentDescriptor> .

@ Майкл дает правильный ответ и объяснение. Вот пример одной стратегии для модульного тестирования Set многосвязности для тех, кто хотел бы протестировать свои модули:

 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) } } 
Intereting Posts
Как издеваться над классом Kotlin (final) с помощью PowerMock? Работает ли KAnnotator в Android Studio? Кодирование запроса почтальона Eclipse Aether не разрешает `LATEST` правильно Как db передал значение в Котлин? Способы запутывания доступа к привилегированным частным, но на самом деле публичным членам класса для использования их в встроенных методах Как использовать AndroidAnnotation @FragmentArg с Kotlin? Дооснащение 2 Длина содержимого RequestBody больше, чем размер файла Переключение между классами фрагментов в Котлине Перегруженные методы, получающие функции более высокого порядка в Котлине Являются ли оптимизаторы Kotlin Float, Int и т. Д. Для встроенных типов в JVM? Тип вывода с ленивой инициализацией и общим заводским методом в Котлине Классы вложенных объектов Kotlin только один сопутствующий объект разрешен для каждого класса в Котлине Onclick не отвечает с помощью kotlin в андроид-студии