Недавно я преобразовал большую часть своего проекта в kotlin. Теперь я сталкиваюсь с несколькими необычными ошибками, которые, как представляется, связаны с библиотеками аннотаций. Излишне говорить, что этого не произошло на Java.Обработка аннотации Kotlin игнорирует элементы с похожими именами
Я опишу случаи - один в кинжале и один в Butterknife.
1. При использовании 2 @Provides
методов в различных моделей с одноименными идентификаторами. Например, в файле «FooProvider.kt», имеющий метод «provideFooOrBar»
@Module
class FooProvider(private val view: FooActivity) {
...
@Provides @FooScope fun provideView() = view
@Provides @FooScope fun provideFooOrBar() = Foo()
}
И имея другой файл «BarProvider.kt» с тем же именем метода
@Module
class BarProvider(private val view: BarActivity) {
...
@Provides @BarScope fun provideView() = view
@Provides @BarScope fun provideFooOrBar() = Bar()
}
В этом случае Dagger терпит неудачу для создания некоторых заводских библиотек, и я получаю следующее сообщение об ошибке компиляции: Error:(27, 32) error: cannot find symbol class FooProvider_ProvideFooOrBarFactory
пример проекта воспроизведения проблемы можно найти на https://github.com/maxandron/DaggerIssue325
2. Это проблема при использовании Butterknife. При наличии двух аннотированных переменных @Bind
в двух разных классах - один из них просто не инициализируется во время выполнения без какой-либо ошибки компиляции!
Например, если у меня есть:
class FooActivity {
@Bind(R.id.foo) lateinit var mFoo: View
}
class NotFooActivity {
@Bind(R.id.not_foo) lateinit var mFoo: View
}
Тогда один из них (? Или оба) просто не будет инициализировать без каких-либо ошибок. Причинение исключения kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized
, которое будет выбрано при доступе к полю.
Это что-то я делаю неправильно в настройке Kotlin или это ошибка kotlin?
Спасибо заранее! Ron
Эти два вопроса выглядят не связаны со мной, пожалуйста, не спрашивайте два разных вопроса в одном SO пост в следующий раз –
я отправил их в тот же вопрос, потому что это похоже. Я не думаю, что это ошибка кинжала или масляного ножа - я думаю, что это ошибка kotlin. Я не пытаюсь найти решения для ошибки - я их знаю, я хочу понять причину. – maxandron
Они, вероятно, две разные проблемы. Один для методов, а другой для того, где вы разместили аннотацию на свойстве. Читайте об объектах целевого использования Anotation Use-Site и посмотрите, поможет ли это решить 2-й https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets, а также, возможно, сделать JvmField доступным для чего butterknife хочет https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields –