Groovy:相同的参数,不同的结果

Cli*_*ton 5 groovy

在下面的代码中,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
Run Code Online (Sandbox Code Playgroud)

Chr*_*s B 11

问题是,yz,虽然它们看起来是一样的,实际上是不同的类型.y是一段Object[]时间zArrayList<Integer>.Groovy以不同方式处理数组和列表,自动将前者强制转换为varargs参数列表,而不是后者.

println y.getClass(); // class [Ljava.lang.Object
println z.getClass(); // class java.util.ArrayList
Run Code Online (Sandbox Code Playgroud)

至于你的问题的解决方案,要么改变你test()的方式List而不是数组:

class Test { List test() { return [1,2]; } }
Run Code Online (Sandbox Code Playgroud)

将数组传递给时,手动将数组强制转换为列表f:

f(y as List); // 1
Run Code Online (Sandbox Code Playgroud)


man*_*ana 0

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

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

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