有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当使用操作符重载时,在闭包中或甚至在方法中更新时,不会发生对我的列表的java更新

  1. 看起来,当您将列表传递到方法/闭包中时,Groovy会在闭包或方法中创建列表的副本,并进行更新,以便退出后不会反映您的更改!!!如果使用,则情况并非如此。添加方法

  2. Groovy为什么要改变这一最直观的行为 Java开发人员在与运算符一起使用列表加法时 超载+符号

  3. Groovy的观点有什么好处

  4. 如果我在代码示例中取消注释增强的for循环,并使用+号注释掉添加的列表,它的行为与预期的一样

*

List<String> b = ['man', 'lady']

def x = { List<String> p ->

    println delegate.getClass().getName()
    List<String> inx = ['dog','cat']
    /*for (String l : inx)
    {
        p.add(l)
    }*/
    p = p + inx //value of p is not reflected whence you exit

}

def xmethod(List<String> p)
{
    List<String> inx = ['monkey','lion']
    /*for (String l : inx)
    {
      p.add(l)
    }*/
    p = p + inx // value of p is not reflected whence you exit

}

x( b )
println b

xmethod( b )
println b

共 (1) 个答案

  1. # 1 楼答案

    给定:p = p + inx其中pinx是列表

    这可以理解为:p = p.plus(inx),在Groovy中是重载的 方法返回传递的列表的新副本,当然 将在内存中有一个新地址。因此,它不会更新 传入的列表

    当该方法返回并从堆栈中返回时,将在其中创建列表 被移除,并且不再存在

    在使用p.plus(inx)p + inx时,这非常重要 特别是如果p被传递到方法中,并且您希望 要反映回传递给的原始p的更改 改用p.addAll(inx)方法

    顺便说一句,地图也是如此,请参阅:Groovy (or Java) - Pass by reference into a wrapper object