尽管启用了 kapt. CorrectErrorTypes,kapt 仍将生成的类引用替换为 error.NonExistentClass

Nam*_*rel 5 gradle annotation-processing kotlin kapt

我有一个自定义注释处理器,大致执行以下操作:

  • 生成注释类型(使用此类型的类被推迟到后面的轮次)
  • 在后面的一轮中,使用这种类型处理类并为它们生成更多文件

到目前为止,这在 Java 中运行良好。但最近,我将一些类从 Java 转换为 Kotlin。设置仍然相同。但是当我使用生成的注释类型将类转换为 Kotlin 时,会弹出以下错误:

错误:不兼容的类型:NonExistentClass 无法转换为注释 @error.NonExistentClass()

值得注意的是,只有当文件位于 Kotlin 中时才会发生这种情况 - 其他(Java)文件也使用相同的注释,并且当我从 Kotlin 文件中删除注释时它们不会产生错误。

经过一番谷歌搜索后,我发现推荐的解决方案是向以下添加一个选项build.gradle

kapt {
 correctErrorTypes = true 
} 
Run Code Online (Sandbox Code Playgroud)

然而,使用这个并没有解决问题。我查看了生成的存根文件,很明显,尽管设置如下,但它kapt仍然继续放入error.NonExistentClass其中:

kapt {
 correctErrorTypes = true 
} 
Run Code Online (Sandbox Code Playgroud)

我认为值得注意的是:

  • 存根保留了生成注释的正确导入
  • kapt将注释移至静态方法,而原始生成的注释仅支持字段

MyClass看起来像这样:

package my.pckg

import my.pckg.GeneratedAnnotation

class MyClass {

    @GeneratedAnnotation
    var myAnnotatedField: Int = 0

    //...
}

Run Code Online (Sandbox Code Playgroud)

这是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"

    //...
}
Run Code Online (Sandbox Code Playgroud)

SO 上还有其他 人遇到过 这个问题 ,但是那里建议的解决方案都没有为我解决。

编辑:我做了一些更多的测试,发现生成的类型在该类型用作注释时才会被替换error.NonExistentClass(作为对象类型甚至泛型参数,它工作得很好)。此时我相信这可能只是一个kapt 错误