gpt4 book ai didi

Kotlin 在伴随对象中使用 apply 会引发意外错误

转载 作者:行者123 更新时间:2023-12-04 19:02:36 25 4
gpt4 key购买 nike

假设我想实例化一个 A 类的对象。通过从类 B 中复制值例如,在映射 DTO 时,这是一种常见的做法。为了在 Java 或 Groovy 中完成此操作,我将在适当的 DTO 上创建一个静态方法,其签名为 fromB(A a)。然后使用 a.val = b.val... 复制值在 Java 中或使用 a.with { val = b.val... }在 Groovy 中。

在 Kotlin 中,我注意到 instance.apply{}与 Groovy 的 with 非常相似因为它允许我直接访问对象变量而无需经常引用对象本身,因为引用似乎隐含在闭包中。

但是,在伴随对象中使用 apply 时,我遇到了一个奇怪且意外的错误。如果我使用 A().apply {}在 A 的伴随对象的函数中,我得到一个错误 Expression is inaccessible from a nested class 'Companion', use 'inner' keyword to make the class inner这很奇怪,因为我直接在对象的实例上调用 apply ,因此希望我应该始终能够访问它的公共(public)属性。更不用说似乎无法将伴随对象设置为 inner因此错误消息中的建议并不是很有帮助。

这是完整的示例代码:

fun main(args: Array<String>) {
val b = B("Hello", "World")
val a = A.fromB(b)

print("$a.value1 $a.value2")
}


class A() {
var value1: String? = null
var value2: String? = null

companion object {
//This fails with "Expression is inaccessible from a nested class 'Companion', use 'inner' keyword to make the class inner"
fun fromB(b: B): A {
return A().apply {
value1 = b.value3
value2 = b.value4
}
}
}
}

class B(val value3: String, val value4: String) {}

//This works
fun bToA(b: B): A {
return A().apply {
value1 = b.value3
value2 = b.value4
}
}

这里发生了什么?我究竟做错了什么?

最佳答案

这对我来说似乎是一个错误。可能与内联函数(例如 apply )和伴随对象有关。我建议搜索 JetBrains Bug & Issue Tracker如果您没有找到与此类似的内容,则会创建一个新问题。

与此同时,我看到了一些替代方案:

  • 使用this (不理想):
    fun fromB(b: B): A {
    return A().apply {
    this.value1 = b.value3
    this.value2 = b.value4
    }
    }
  • 移动value1value2A的主构造函数和更改 fromB(B)使用命名参数(这仍然可以让您定义默认值,复制时跳过属性等):
    class A(var value1: String? = null, var value2: String? = null) {
    companion object {
    fun fromB(b: B): A {
    return A(
    value1 = b.value3,
    value2 = b.value4
    )
    }
    }
    }

    更新:除上述内容外,您还可以使用 bwith :
    fun fromB(b: B) = with(b) {
    A(
    value1 = value3,
    value2 = value4
    )
    }
  • 关于Kotlin 在伴随对象中使用 apply 会引发意外错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34164058/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com