我有一个自定义注释处理器,可以大致执行以下操作:
到目前为止,这在Java中效果很好。但是最近,我一直在将某些类从Java转换为Kotlin。设置仍然相同。 但是,当我使用生成的注释类型将类转换为Kotlin时,会弹出此错误:
错误:不兼容的类型:NonExistentClass无法转换为Annotation @ error.NonExistentClass()
值得注意的是,只有在文件位于Kotlin中时才会发生这种情况-其他(Java)文件也使用相同的注释,并且当我从Kotlin文件中删除注释时它们不会产生错误。
经过一番谷歌搜索,我发现建议的解决方案是将an option添加到build.gradle
:
kapt {
correctErrorTypes = true
}
但是,使用此方法不能解决问题。我查看了生成的存根文件,很明显kapt
仍然将error.NonExistentClass
放在其中,尽管设置如下:
package my.pckg;
import my.pckg.GeneratedAnnotation;
@kotlin.Metadata(...)
public final class MyClass {
private int myAnnotatedField;
@error.NonExistentClass()
public static void myAnnotatedField$annotations() {
}
public final int getMyAnnotatedField() {
return 0;
}
public final void setMyAnnotatedField(int p0) {
}
//...
}
我认为值得注意的是:
kapt
将注释移至静态方法,而原始生成的注释仅支持字段 MyClass
看起来像这样:
package my.pckg
import my.pckg.GeneratedAnnotation
class MyClass {
@GeneratedAnnotation
var myAnnotatedField: Int = 0
//...
}
这是build.gradle
:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
//...
kotlinOptions {
jvmTarget = '1.8'
}
}
kapt {
correctErrorTypes = true
}
dependencies {
kapt 'custom.annotation.processor'
implementation "androidx.core:core-ktx:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.41"
//...
}
有have been other people with this problem on SO,但那里没有建议的解决方案为我解决。
编辑:我进行了更多测试,发现当类型用作注释时,生成的类型仅由error.NonExistentClass
替换为kapt
(作为对象类型甚至泛型参数,它都可以正常工作)。在这一点上,我认为这可能只是SECRET_KEY
bug。