Groovy 如何对varargs变量调用findResult

Groovy 如何对varargs变量调用findResult,groovy,Groovy,我已经编写Groovy大约3天了(来自Python),对varargs有点困惑 我有这个: def wtf(整数…VAL){ println vals.getClass() filtered=vals.findResults{it>4?it:null} } wtf(1,2,3,4,5,6,7) 产生: class [Ljava.lang.Integer; groovy.lang.MissingMethodException: No signature of method: [Ljava.lan

我已经编写Groovy大约3天了(来自Python),对varargs有点困惑

我有这个:

def wtf(整数…VAL){ println vals.getClass() filtered=vals.findResults{it>4?it:null} } wtf(1,2,3,4,5,6,7) 产生:

class [Ljava.lang.Integer;
groovy.lang.MissingMethodException: No signature of method: [Ljava.lang.Integer;.findResults() is applicable for argument types: (Script1$_wtf_closure1) values: [Script1$_wtf_closure1@5bcf875d]
Possible solutions: findResult(groovy.lang.Closure), findResult(java.lang.Object, groovy.lang.Closure)
因此,我的
val
vararg类型似乎没有
findResults
方法

从文档中可以看出,该方法来自于
集合
,它听起来像是类似列表的对象的一个相当通用的基类


所以。。。vararg的类型是什么?它似乎是
[Ljava.lang.Integer
,但我不确定这在Groovy术语中到底意味着什么。为什么它给了我一个无用的类型?

我找到了一个解决方案,我想思考Groovy为什么是这样设计的并不十分有效

def wtf(Integer ...vals) {
  filtered = (vals as Collection).findResults{ it > 4 ? it : null }
  println filtered
}

wtf(1, 2, 3, 4, 5, 6, 7)

> Result: [5, 6, 7]
是Java命名中的整数数组…(即:a
Integer[]

因此,您只需将其放入列表:

def wtf(Integer ...vals) {
    filtered = vals.toList().findResults{ it > 4 ? it : null }
}

数组在Java中不是集合,这就是问题所在,这本不应该如此令人惊讶,从现在的阅读来看,数组似乎是一个固定大小的集合,因此更类似于Python的元组(vs可变列表)这也是你从
*args
得到的。谢谢你的帮助!我以为我已经试过了!我实际试过的是
vals=vals.toList();vals.findResults{…}
…这给出了原始错误,这似乎意味着第一行以静默方式失败。Groovy WTF?但到那时,您已经向Groovy说明
VAL
的类型是
Integer[]
,因此它可能会将数组更改为列表,然后将其更改回数组以将其存储在
VAL
…如果您将wtf声明为
def wtf(…VAL)
它应该已经工作了!我明白了!
def wtf(…VAL)
似乎不工作,尽管您是对的
def wtf(…VAL)
不工作:-(很抱歉:-(
def wtf(Integer ...vals) {
    filtered = vals.toList().findResults{ it > 4 ? it : null }
}