我有一个带有模态类User的多平台项目。
User.kt
class User {
val id = -1
val username = ""
val age = -1
val nickname = ""
}
我也有预期的和实际的注释
Annotation.kt [通用模块]
expect annotation class NodeEntity
expect annotation class Id
expect annotation class GeneratedValue
此外,我有他们的实际实现方式
Annotation.kt [JVM模块]
actual typealias ValueFor = org.neo4j.ogm.annotation.ValueFor
actual typealias NodeEntity = org.neo4j.ogm.annotation.NodeEntity
actual typealias Id = org.neo4j.ogm.annotation.Id
actual typealias GeneratedValue = org.neo4j.ogm.annotation.GeneratedValue
actual typealias Relationship = org.neo4j.ogm.annotation.Relationship
然后我回去给我的User.kt加上注释
@NodeEntity
class User {
@Id
@GeneratedValue
val id = -1
val username = ""
val age = -1
val nickname = ""
}
但是当我编译它时,会出现此错误
Task :compileKotlinJvm FAILED
e: ...User.kt: (13, 2): This class does not have a constructor
e: ...User.kt: (21, 6): This class does not have a constructor
e: ...User.kt: (22, 6): This class does not have a constructor
我在做什么错了?
N:B。尝试完成
仅供参考:我的build.gradle已经具有noArg,因此User.kt类使用无参数的公共构造函数进行编译
答案 0 :(得分:0)
您期望的注释可能需要显式括号。
expect annotation class SharedImmutable()
actual typealias SharedImmutable = kotlin.native.SharedImmutable
答案 1 :(得分:0)
我遇到了类似的问题,但是看起来像OP,我已经包含了显式括号。我的特定问题与Java Source Set中的Java库有关,而依赖于它的另一个Gradle子项目无法使用。
TL; DR
确认您正在正确公开特定于平台的依赖项。例如,在implementation
文件中正确使用api
和build.gradle
。
详细说明我的情况
我有一个Gradle多项目构建:
Project
AppSubProject
LibrarySubProject
AppSubProject
取决于LibrarySubProject
的位置。两个Gradle子项目都是Kotlin多平台模块。
在LibrarySubProject
中,有一个公开的注释类:
公共源集:
expect annotation class Inject()
JVM源集:
actual typealias Inject = javax.inject.Inject
Kotlin Common Inject
注释可用于AppSubProject
,因为它依赖于LibrarySubProject
。
AppSubProject / build.gradle:
...
commonMain {
dependencies {
implementation project(":LibrarySubProject")
...
问题原因
在LibrarySubProject/build.gradle
文件中,我没有公开JVM依赖项:
...
jvmMain {
dependencies {
implementation "javax.inject:javax.inject:1"
...
如您所见,我使用的是implementation
而不是api
。因此,当我在AppSubProject
中的类的构造函数上使用注释时:
class Example @Inject constructor()
当我构建AppSubProject
时,它无法解决JVM依赖关系,并且暗中给了我以下错误:
e: Example.kt: This class does not have a constructor
解决方案
解决方案只是公开JVM依赖关系,以便可以在其他模块中解决它。因此,将implementation
更改为api
解决了该问题。
...
jvmMain {
dependencies {
api "javax.inject:javax.inject:1"
...
总结
如果遇到此问题,请声明以下内容: