Вы можете использовать .invokeWithArguments
, который вычислит правильную арность из предоставленных аргументов:
(.invokeWithArguments concat-handle (object-array ["hello" "there"]))
=> "hellothere"
Или вы можете использовать .invoke
, но вам понадобится MethodHandle.asSpreader
, чтобы применить переменныеправильно String.concat
с фиксированной арностью:
(def ^MethodHandle other-handle
(.asSpreader
concat-handle
(Class/forName "[Ljava.lang.String;") ;; String[].class
2))
(.invoke other-handle (into-array String ["hello" "there"]))
=> "hellothere"
Я не уверен, как заставить это работать с .invokeExact
из Clojure, если это возможно.
дескриптор символьного типа на сайте вызова invokeExact должен точно соответствовать типу этого дескриптора метода.Не допускается преобразование аргументов или возвращаемых значений.
В этом ответе содержится более подробное объяснение ограничений .invoke
и .invokeExact
.