【问题标题】:Kotlin/KAPT Generated Kotlin class is not recognized as class member, but it does inside of methodsKotlin/KAPT 生成的 Kotlin 类不被识别为类成员,但它在方法内部
【发布时间】:2018-05-23 16:37:19
【问题描述】:

我写了一个注解处理器,它为我的类生成一个构建器类,用@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;
    }
}

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

更新

我刚刚使用必要的代码创建了这个 repo 来复制问题 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

【问题讨论】:

  • 源码是在哪里生成的,目录是添加到源码集中的吗?
  • @EpicPandaForce 生成的源在...build/generated/source/kapt/debug/... 它与匕首和其他注释处理器使用的目录相同,我的Android Studio 识别生成的类,我可以在方法中使用该类,但不能作为班级成员。

标签: java kotlin kapt annotation-processor kotlinpoet


【解决方案1】:

查看您的 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 模块中被声明为implementationapp 模块不会将其视为传递依赖,这可能是编译失败的原因。要修复它,您可能应该在 app 模块中声明正确的依赖关系,或者至少在 annotations 中为 kotlin-stdlib-jdk7 使用 apiElements 范围。

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

【讨论】:

  • 其实我是在 Android Studio 中创建了支持 Kotlin 的项目,可能 AS 默认没有添加,可以在新的 kotlin gradle 插件中解决,但不确定。我只是推动了添加 kotlin 运行时依赖项的更改,但这没有帮助。无论如何都很好。
猜你喜欢
  • 2016-10-27
  • 2019-09-03
  • 2016-02-09
  • 2021-07-31
  • 1970-01-01
  • 2017-04-15
  • 2023-01-08
  • 2017-04-13
  • 2018-07-16
相关资源
最近更新 更多