Kotlin/KAPT Генерируемый класс Kotlin не распознается как член класса, но это происходит внутри методов
Я написал процессор аннотаций, который генерирует класс построителя для моих классов, помеченных @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)
НО я НЕ могу использовать сгенерированный MyModelBuilder
Класс Kotlin внутри класса Java в качестве члена класса
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 Issue: https://youtrack.jetbrains.net/issue/KT-24591
1 ответ
Глядя на ваш проект Github, я замечаю, что вы не объявляете зависимость от kotlin-stdlib-jdk7
в app
модуль. Когда я собираю модуль, компилятор выдает следующие предупреждения:
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
объявлен как implementation
в annotations
модуль, app
Модуль не рассматривает это как транзитивную зависимость, что может быть причиной сбоя компиляции. Чтобы исправить это, вы, вероятно, должны объявить правильную зависимость в app
модуль или хотя бы использовать apiElements
сфера для kotlin-stdlib-jdk7
в annotations
,
Тот факт, что среда IDE не уведомляет вас о сбое компиляции, может быть ошибкой инструментов, но определенно нет основной проблемы компилятора Kotlin.