在下面的代码中,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
问题是,y
和z
,虽然它们看起来是一样的,实际上是不同的类型.y
是一段Object[]
时间z
了ArrayList<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)
y
[Ljava.lang.Object
是while的实例[1,2]
并且z
是 的实例ArrayList
数组将size() == 2
和ArrayList
s 计数作为一个参数,但它们包含两个元素
Groovy 会为您进行一些类型转换;)
归档时间: |
|
查看次数: |
218 次 |
最近记录: |