0

我已经编写了一个注释处理器,它为我的类生成一个构建器类@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 类中使用生成的MyModelBuilderKotlin 类作为类成员

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

4

1 回答 1

1

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

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

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

于 2018-06-01T20:59:26.413 回答