Обработка аннотации Kotlin игнорирует элементы с похожими именами

Недавно я преобразовал большую часть своего проекта в kotlin. Теперь я сталкиваюсь с несколькими необычными ошибками, которые, как представляется, связаны с библиотеками аннотаций. Излишне говорить, что этого не произошло на Java.

Я опишу случаи – один в кинжале и один в Butterknife.

1. При использовании двух методов @Provides в разных моделях с тем же именем. Например, в файле «FooProvider.kt», имеющем метод «обеспечитьFooOrBar»

 @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.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized при обращении к полю.


Это что-то я делаю неправильно в настройке Kotlin или это ошибка kotlin?

Заранее спасибо! Рон

Solutions Collecting From Web of "Обработка аннотации Kotlin игнорирует элементы с похожими именами"

У меня была эта проблема, поэтому я начал расследование, и это вызвано тем, что Kapt проверяет имя метода только при их сравнении, и они добавляются в набор , поэтому дубликаты не допускаются. То же самое происходит для аннотированных полей, поэтому в настоящее время вы можете иметь одно имя метода / поля для каждой аннотации.

Я добавил имя класса методу equals и аннотации были правильно обработаны сейчас, но тесты сломались, и я не знаю, как они работают, поэтому я надеюсь, что кто-то знает, как это исправить.

Это оказалось ошибкой с kapt. Я отправил сообщение об ошибке для трекера Kotlin, и проблема теперь отмечена как исправленная.

Это решение было объединено

Должен быть разрешен в версии 1.0.2

Поэтому, чтобы немного ответить на вопрос kotlin.UninitializedPropertyAccessException: lateinit , я kotlin.UninitializedPropertyAccessException: lateinit с тем же самым в моем проекте . То, что я сделал, «решило проблему» для меня, было удалить Butterknife из класса-нарушителя, в этом случае это был просто viewHolder для моего нового расширяемого RecyclerView, а затем снова запустить приложение.

@Bind(R.id.my_view_id) приложение, переключив все мои @Bind(R.id.my_view_id) в «старую школу» findViewById(R.id.my_view_id) as MyViewType работает findViewById(R.id.my_view_id) as MyViewType , но потом впоследствии я переключил тот же класс обратно на Butterknife и UninitializedPropertyAccessException ушел, и кажется, что он не вернется, если что-то в классе не изменится, тогда вам придется снова повторить этот процесс.

Мое подозрение здесь в том, что это имеет какое-то отношение к Kotlin, не поддерживающему инкрементную компиляцию, и каким-то образом, изменив автоматически сгенерированный код, он был вынужден перекомпилировать. Но я мог бы быть здесь, просто подумал, что поделюсь своим опытом.