Kotlin Multiplatform预期注释返回`该类没有具有neo4j实际typealias的构造函数`

时间:2019-01-10 08:20:49

标签: kotlin kotlin-multiplatform

我有一个带有模态类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。尝试完成

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我遇到了类似的问题,但是看起来像OP,我已经包含了显式括号。我的特定问题与Java Source Set中的Java库有关,而依赖于它的另一个Gradle子项目无法使用。

TL; DR

确认您正在正确公开特定于平台的依赖项。例如,在implementation文件中正确使用apibuild.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"
...

总结

如果遇到此问题,请声明以下内容:

  • this answer
  • 所述,Kotlin公共注释类显式提供了构造函数括号。
  • 所有必要的特定于平台的依赖项均已正确公开