Kotlin在伴侣对象中使用Apply引发意外错误

犁先生

假设我想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,因此希望我始终可以访问它的公共属性。更不用说似乎不能将伴侣对象设置为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
            }
}

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

mfulton26

在我看来,这似乎是个虫子。可能与内联函数(例如apply)和伴随对象有关。我建议搜索JetBrains Bug&Issue Tracker,如果找不到与此类似的东西,请创建一个新的Issue。

同时,我看到了一些替代方法:

  1. 使用this(不理想):

    fun fromB(b: B): A {
        return A().apply {
            this.value1 = b.value3
            this.value2 = b.value4
        }
    }
    
  2. value1value2移至A的主要构造函数,然后更改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
        )
    }
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Kotlin:多个命名伴侣对象

来自分类Dev

在Kotlin中使用JSONObject总是会引发错误

来自分类Dev

BigQuery引发“意外”错误

来自分类Dev

在VBA公式中使用字符串变量引发对象/应用程序错误

来自分类常见问题

Kotlin:类中的对象和伴侣对象之间的区别

来自分类Dev

Kotlin对象vs伴侣对象vs包范围方法

来自分类Dev

在haml嵌套中使用yield的意外错误

来自分类Dev

如何在Java中访问Kotlin伴侣对象?

来自分类Dev

在 Kotlin 中使用 Android 数据绑定初始化 RecyclerView 会引发错误。我究竟做错了什么?

来自分类Dev

Mocha为ES6对象散布运算符引发了意外的令牌错误

来自分类Dev

伴侣对象在类中时使用.tupled方法

来自分类Dev

如何在VBA中使用Excel Prompt引发错误

来自分类Dev

在SQL查询中使用变量会引发ADO错误

来自分类Dev

在Django中使用默认URL值会引发404错误

来自分类Dev

在Laravel中使用pingpong / widget会引发错误

来自分类Dev

使用矢量可绘制对象时通知引发错误

来自分类Dev

JSON.parse引发意外的令牌错误

来自分类Dev

Ember-cli引发意外令牌错误

来自分类Dev

Starling Touch事件引发意外错误

来自分类Dev

JSON.parse引发意外的令牌错误

来自分类Dev

onClick =()=> {在gulp中引发意外的令牌错误

来自分类Dev

在Blazor中使用JsonPatchDocument发生意外错误

来自分类Dev

kotlin,如何将扩展功能添加到已定义的类伴侣对象中

来自分类Dev

Kotlin:伴侣对象lateinit vars是否初始化过一次?

来自分类Dev

在JavaScript中使用[apply]和[new]创建对象?

来自分类Dev

React Native Expo“加载时AppLoading引发意外错误”错误

来自分类Dev

在 Pandas 库中使用 .apply 并出现“np not callable”错误

来自分类Dev

在 Kotlin 中使用动态字段解析 json 对象

来自分类Dev

无法在 Kotlin 中使用 Moshi 解析 Map<String, Double> - 意外的原始双精度

Related 相关文章

  1. 1

    Kotlin:多个命名伴侣对象

  2. 2

    在Kotlin中使用JSONObject总是会引发错误

  3. 3

    BigQuery引发“意外”错误

  4. 4

    在VBA公式中使用字符串变量引发对象/应用程序错误

  5. 5

    Kotlin:类中的对象和伴侣对象之间的区别

  6. 6

    Kotlin对象vs伴侣对象vs包范围方法

  7. 7

    在haml嵌套中使用yield的意外错误

  8. 8

    如何在Java中访问Kotlin伴侣对象?

  9. 9

    在 Kotlin 中使用 Android 数据绑定初始化 RecyclerView 会引发错误。我究竟做错了什么?

  10. 10

    Mocha为ES6对象散布运算符引发了意外的令牌错误

  11. 11

    伴侣对象在类中时使用.tupled方法

  12. 12

    如何在VBA中使用Excel Prompt引发错误

  13. 13

    在SQL查询中使用变量会引发ADO错误

  14. 14

    在Django中使用默认URL值会引发404错误

  15. 15

    在Laravel中使用pingpong / widget会引发错误

  16. 16

    使用矢量可绘制对象时通知引发错误

  17. 17

    JSON.parse引发意外的令牌错误

  18. 18

    Ember-cli引发意外令牌错误

  19. 19

    Starling Touch事件引发意外错误

  20. 20

    JSON.parse引发意外的令牌错误

  21. 21

    onClick =()=> {在gulp中引发意外的令牌错误

  22. 22

    在Blazor中使用JsonPatchDocument发生意外错误

  23. 23

    kotlin,如何将扩展功能添加到已定义的类伴侣对象中

  24. 24

    Kotlin:伴侣对象lateinit vars是否初始化过一次?

  25. 25

    在JavaScript中使用[apply]和[new]创建对象?

  26. 26

    React Native Expo“加载时AppLoading引发意外错误”错误

  27. 27

    在 Pandas 库中使用 .apply 并出现“np not callable”错误

  28. 28

    在 Kotlin 中使用动态字段解析 json 对象

  29. 29

    无法在 Kotlin 中使用 Moshi 解析 Map<String, Double> - 意外的原始双精度

热门标签

归档