Kotlin注解处理会忽略具有相似名称的项目

我最近把我的大部分项目都转换成了kotlin。 现在我遇到了几个似乎与注释库有关的不寻常的错误。 不用说,它并没有在Java中发生。

我将描述这些案例 – 一个在匕首,另一个在Butterknife。

1.在具有相同名称的不同模型中使用2个@Provides方法时。 例如在具有“provideFooOrBar”方法的文件“FooProvider.kt”中

 @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错误?

先谢谢你! 罗恩

我有这个问题,所以我开始调查,这是因为Kapt只比较它们时检查方法名称 , 它们被添加到一个集合 ,因此不允许重复。 注释字段也是一样,所以当前每个注释可以有一个方法/字段名称。

我将类名添加到equals方法中,现在注释已经被正确地处理了,但是测试打破了,我不知道它们是如何工作的,所以我希望有人知道如何解决这个问题。

原来是kapt的一个bug。 我在Kotlin的bug跟踪器上发布了一个问题 ,现在这个问题被标记为已修复。

此解决方案已合并

应该在Kotlin版本1.0.2中解决

所以有点回答kotlin.UninitializedPropertyAccessException: lateinit问题,我在我的项目中运行到完全相同的东西。 我为我解决问题的做法是从违规类中删除Butterknife,在这种情况下,它只是我新的可扩展RecyclerView的一个视图,然后再次运行应用程序。

运行该应用程序后,切换所有我的@Bind(R.id.my_view_id)为“旧学校” findViewById(R.id.my_view_id) as MyViewType工作,但随后随后我把同一个类切换 ButterknifeButterknife走了,似乎它不会回来,除非班上的东西改变了,那么你将不得不重复这个过程。

我的怀疑是,这与Kotlin不支持渐进式编译有关,并且通过改变自动生成的代码来强制重新编译。 但是我可以走了,只是想分享我的经验。