6

在下面的代码中,x.test()返回[1,2].

所以y = [1,2]

然而f([1,2])打印1,但f(y)打印2

我该怎么写f(y)才能打印出来1

反常地f(z)打印1,即使z = y

def f = { Object... args -> println args.size(); };

class Test { Object[] test() { return [1,2]; } }

def x = new Test();
def y = x.test();
def z = [1,2];

f([1,2]); // 1
f(y); // 2
f(z); // 1
4

3 回答 3

12

问题是yz,虽然它们看起来相同,但实际上是不同的类型。yObject[]一会儿z是一个ArrayList<Integer>。Groovy 以不同的方式处理数组和列表,自动将前者强制转换为 varargs 参数列表,而不是后者。

println y.getClass(); // class [Ljava.lang.Object
println z.getClass(); // class java.util.ArrayList

至于您的问题的解决方案,要么将您更改test()为返回 aList而不是数组:

class Test { List test() { return [1,2]; } }

或在将数组传递给时手动将其强制转换为列表f

f(y as List); // 1
于 2013-06-03T06:44:38.797 回答
3

Groovy 中的表达式[1,2]表示具有两个成员的 ArrayListInteger.valueOf(1)Integer.valueOf(2)。因此,当您调用f([1,2])Groovy 时,会创建一个包含此 ArrayList 作为其唯一项的单元素数组,并将该数组作为闭包参数传​​递。

但是x.test()被声明为返回Object[],因此[1,2]ArrayListObject[]将由return. 因此y已经是一个Object[]并且不需要被装箱在一个可变参数数组中传递给f.

您需要y通过更改返回类型test()或说

f(y as List)

相反,您可以使用扩展运算符

f(*z) // 2

这将提取 ArrayList 的元素并将它们作为单独的参数传递给调用(然后像往常一样将其打包到 varargs 数组中)。

于 2013-06-03T06:49:36.953 回答
0

y是 while 的一个实例,[Ljava.lang.Object并且[1,2]zof 的实例ArrayList

Array 将 thesize() == 2ArrayLists 作为一个参数,但它们包含两个元素

Groovy 会为您进行一些类型转换;)

于 2013-06-03T06:44:34.797 回答