Вместо этого вы хотели сделать следующее?
MetaMethod metmeth = mc.getStaticMetaMethod(name, types as Class[])
Допустим, аргументы были [1,"abc",true]
.Это приведет к тому, что types
будет [Integer,String,Boolean]
.
Использование оператора распространения (*
) приводит к тому, что Groovy пытается вызвать метод с сигнатурой, такой как getStaticMetaMethod(String,Integer,String,Boolean)
.Вероятно, это не то, что вы намеревались.
Однако, поскольку нет метода этой подписи, Groovy возвращается к попытке преобразовать *type
в соответствующий объект, подобный коллекции.В этом случае он имеет опцию Class[]
или Object[]
, поскольку существуют методы getStaticMetaMethod(String,Class[])
и getStaticMetaMethod(String,Object[])
.
Когда аргументы содержат только нулевое значение, Groovy не может выбирать междуприведение к Class[]
или Object[]
, и, следовательно, исключение.Использование явного приведения (types as Class[]
) проясняет ваше намерение в Groovy и устраняет неоднозначность.
Кстати, вы можете воспроизвести исключение с помощью исходного кода и:
class A {
static def doX(String s) { }
}
traceMethods(A)
A.doX(null)