gpt4 book ai didi

java - Kotlin/KAPT 生成的 Kotlin 类不被识别为类成员,但它在方法内部被识别

转载 作者:行者123 更新时间:2023-12-02 11:12:53 25 4
gpt4 key购买 nike

我编写了一个注释处理器,它为使用 @DataBuilder 注释的类生成构建器类

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class DataBuilder

用此注释注释的我的类位于 com.my.package.model 包中,生成的构建器类也位于同一包 com.my.package.model 中 但当然在生成的目录 build/generated/source/kapt/debug/com/my/package/model/MyModelBuilder.kt 中,我可以在我的内部很好地使用这些生成的类模型类(用 Kotlin 编写)

但是不能在 java 类中使用生成的 MyModelBuilder Kotlin 类作为类成员

package com.my.package.home;
import com.my.package.model.MyModelBuilder;
public class Home {
MyModelBuilder builder; // <=== AS recognizes the class, but I'm having an compilation issue
}

Android Studio 可以识别该类,但我遇到了这个编译问题

com/my/package/home/Home.java:4: error: cannot find symbol
MyModelBuilder builder;
^
symbol: class MyModelBuilder
location: class Home

这很奇怪,因为我只能在方法内部使用这个生成的构建器类,这段代码编译得很好:

package com.my.package.home;
import com.my.package.model.MyModelBuilder;
public class Home {
public void hello() {
MyModelBuilder builder;
}
}

这里有人可以帮助我理解这种行为以及如何解决这个问题吗?提前谢谢!

更新

我刚刚使用必要的代码创建了这个存储库来复制问题 https://github.com/epool/HelloKapt

该项目在克隆和运行后工作正常,要复制该问题,请取消注释此行 https://github.com/epool/HelloKapt/blob/master/app/src/main/java/com/nearsoft/hellokapt/app/MainActivity.java#L13

注意:如果我将 MainActivity.java 类转换为 Kotlin(MainActivity.kt),则问题无法重现并且工作正常,但由于到目前为止的一些项目限制,我不想这样做

Kotlin 问题: https://youtrack.jetbrains.net/issue/KT-24591

最佳答案

查看您的 Github 项目,我注意到您没有在 app 模块中声明对 kotlin-stdlib-jdk7 的依赖项。当我构建模块时,编译器发出以下警告:

warning: unknown enum constant AnnotationTarget.CLASS
reason: class file for kotlin.annotation.AnnotationTarget not found
warning: unknown enum constant AnnotationRetention.SOURCE
reason: class file for kotlin.annotation.AnnotationRetention not found
warning: unknown enum constant AnnotationTarget.CLASS
reason: class file for kotlin.annotation.AnnotationTarget not found

由于 kotlin-stdlib-jdk7annotations 模块中被声明为 implementation,因此 app 模块不会不要将其视为传递依赖,这可能是编译失败的原因。要修复此问题,您可能应该在 app 模块中声明正确的依赖项,或者至少在 kotlin-stdlib-jdk7 中使用 apiElements 范围注释

IDE 没有通知您编译失败的事实可能是一个工具错误,但绝对不存在底层 Kotlin 编译器问题。

关于java - Kotlin/KAPT 生成的 Kotlin 类不被识别为类成员,但它在方法内部被识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com