首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin多平台预期注释返回‘这个类没有一个带有neo4j实际类型的构造器’

Kotlin多平台预期注释返回‘这个类没有一个带有neo4j实际类型的构造器’
EN

Stack Overflow用户
提问于 2019-01-10 08:20:48
回答 2查看 1.1K关注 0票数 4

我有一个带有模态类的多平台项目,用户。

User.kt

代码语言:javascript
复制
class User {
    val id = -1
    val username = ""
    val age = -1
    val nickname = ""
}

我还期望和实际的注释。

Annotation.kt公共模块

代码语言:javascript
复制
expect annotation class NodeEntity
expect annotation class Id
expect annotation class GeneratedValue

更重要的是,我有它们的实际实现。

Annotation.kt JVM模块

代码语言:javascript
复制
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

代码语言:javascript
复制
@NodeEntity
class User {
    @Id
    @GeneratedValue
    val id = -1
    val username = ""
    val age = -1
    val nickname = ""
}

但是当我编译它时,我会得到这个错误。

代码语言:javascript
复制
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}’在预期注释和实际注释中有冲突的值

FYI:我的build.gradle已经有了noArg,所以User.kt类是用一个无参数的公共构造函数编译的

EN

回答 2

Stack Overflow用户

发布于 2019-01-10 14:05:55

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

代码语言:javascript
复制
expect annotation class SharedImmutable()
代码语言:javascript
复制
actual typealias SharedImmutable = kotlin.native.SharedImmutable

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

票数 4
EN

Stack Overflow用户

发布于 2020-09-01 17:15:41

我也经历过类似的问题,但表面上就像OP一样,我已经包含了明确的括号。我的具体问题与Java源代码集中的Java库有关,无法被依赖于它的另一个Gradle子项目使用。

TL;博士

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

详细介绍了我的场景

我有一个分级多项目的构建:

代码语言:javascript
复制
Project
    AppSubProject
    LibrarySubProject

AppSubProject依赖LibrarySubProject的地方。两个分项目都是Kotlin多平台模块.

LibrarySubProject中,有一个公开的注释类:

公共源集:

代码语言:javascript
复制
expect annotation class Inject()

JVM源集:

代码语言:javascript
复制
actual typealias Inject = javax.inject.Inject

Kotlin公共Inject注释对AppSubProject是可用的,因为它依赖于LibrarySubProject

AppSubProject/build.gradle:

代码语言:javascript
复制
...

commonMain {
    dependencies {
        implementation project(":LibrarySubProject")

...    

问题的起因

LibrarySubProject/build.gradle文件中,我没有公开JVM依赖项:

代码语言:javascript
复制
...

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

如您所见,我使用的是implementation而不是api。因此,当我在AppSubProject中的类的构造函数上使用注释时

代码语言:javascript
复制
class Example @Inject constructor()

当我构建AppSubProject时,它无法解决JVM的依赖关系,并且神秘地给了我以下错误:

代码语言:javascript
复制
e: Example.kt: This class does not have a constructor

解决方案

解决方案只是公开JVM依赖关系,以便在另一个模块中解决它。因此,将implementation改为api解决了这个问题。

代码语言:javascript
复制
...

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

求和

如果遇到此问题,请断言如下:

  • Kotlin公共注释类显式地提供了构造函数括号,如this answer中所指出的
  • 所有必需的平台特定依赖项都会正确地公开。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54124454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档