4

我有一个带有模态类 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

我究竟做错了什么?

注意:B。尝试完成

  • 使预期的注释具有构造函数[不成功]
  • 使预期注释与构造函数匹配 [错误:参数“{0}”在预期和实际注释中的值冲突]

仅供参考:我的 build.gradle 已经有了 noArg,因此 User.kt 类是使用无参数公共构造函数编译的

4

2 回答 2

4

您的期望注释可能需要显式括号。

expect annotation class SharedImmutable()
actual typealias SharedImmutable = kotlin.native.SharedImmutable

https://github.com/touchlab/Stately/blob/4b17057ad5d55f51f4ccf971cf79e51585ad2324/src/commonMain/kotlin/co/touchlab/stately/annotation/Annotations.kt#L26

于 2019-01-10T14:05:55.203 回答
2

我遇到了类似的问题,但看起来像 OP,我已经包含了显式括号。我的特殊问题与 Java 源集中的 Java 库有关,它不适用于依赖它的另一个 Gradle 子项目。

TL;博士

断言您正确地公开了特定于平台的依赖项。例如,在文件中正确使用implementation和。apibuild.gradle

详细说明我的情况

我有一个 Gradle 多项目构建:

Project
    AppSubProject
    LibrarySubProject

AppSubProject取决于哪里LibrarySubProject。两个 Gradle 子项目都是 Kotlin 多平台模块。

LibrarySubProject中,有一个暴露的注解类:

公共源集:

expect annotation class Inject()

JVM 源集:

actual typealias Inject = javax.inject.Inject

Kotlin CommonInject注释可用,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 依赖项,以便可以在其他模块中解决它。因此更改implementationapi解决问题。

...

jvmMain {
    dependencies {
        api "javax.inject:javax.inject:1"
...

求和

如果您遇到此问题,请断言以下内容:

  • Kotlin Common Annotation Class 明确提供构造函数括号,如本答案中所述
  • 所有必要的特定于平台的依赖项都已正确公开
于 2020-09-01T17:15:41.930 回答