Интерфейс ввода кинжала в базовом классе

Я хочу внедрить реализацию интерфейса в конструктор абстрактных классов и использовать его в дочернем классе.

У меня есть ошибки времени компиляции:

Error:Gradle: Dagger does not support injection into private fields Error:Gradle: Example.A cannot be provided without an @Provides-annotated method. Error:Gradle: Example.B cannot be provided without an @Inject constructor or from an @Provides-annotated method. Error:Gradle: Execution failed for task ':app:compileDemoDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details. 

Пример в котлин.

  object Example { interface IData { fun foo() { } } class Data : IData { } @Module class DataModel { @Provides fun data(): IData = Data() } @Singleton @Component(modules = arrayOf(DataModel::class) ) interface Injector { fun inject(a: A) fun inject(b: B) } val graph: Injector = DaggerInjector.builder(). dataModel(DataModel()). build() abstract class A { @Inject var data: IData ? = null public open fun setUp() { graph.inject(this) } } open class B : A() { override fun setUp() { super.setUp() data!!.foo() } } fun bar() { val a = B() a.setUp() } } 

версии:

  • com.android.tools.build:gradle:2.1.2
  • ext.kotlin_version = '1.0.3'
  • compile 'com.google.dagger: кинжал: 2.4'
  • при условии 'org.glassfish: javax.annotation: 10.0-b28'
  • kapt 'com.google.dagger: dagger-compiler: 2.4'

Вот случай. Декомпилированная java

  public static class A { @Inject @Nullable private Example.IData data; @Nullable protected final Example.IData getData() { return this.data; } protected final void setData(@Nullable Example.IData <set-?>) { this.data = <set-?>; } public void setUp() { Example.INSTANCE.getGraph().inject(this); } 

}

Из сообщения об ошибке, я думаю, проблема в этой строке:

 @Inject var data: IData ? = null 

Поле поддержки для этого свойства является private , и об этом говорит ошибка. Обычно для таких случаев используется ключевое слово lateinit :

 @Inject lateinit var data: IData 

lateinit – это один из нескольких модификаторов, которые lateinit поле поддержки непосредственно с уровнем доступа свойства ( public здесь), что делает его видимым для классов, созданных кинжалом.