Вам нужно вызвать метод следующим образом:
s.invoke(this, new Object[]{new Object[]{"hi", "there"}});
(... или используйте альтернативу в ответе @ Jon.)
Причина, по которой ваш текущий код не работает, состоит в том, чтобы сделатьс тем, как varadic методы реализованы в Java.По сути, T1 xxx(T2... args)
является синтаксическим сахаром для T1 xxx(T2[] args)
.И когда вы вызываете методы, xxx(arg1, arg2, arg3)
является синтаксическим сахаром для xxx(new T2[]{arg1, arg2, arg3})
.
В этом случае вы пытаетесь вызвать varadic метод, используя другой varadic метод с тем же базовым типом массива, и есть нескольковозможные интерпретации кода.
Когда есть две возможные интерпретации неконтролируемого вызова, Java предполагает , что вы пытаетесь использовать «несушированную» версию вызова вместо «подслащенной»версияИли, если быть более точным, «подслащенная» интерпретация используется тогда и только тогда, когда :
- количество фактических аргументов не равно количеству формальных параметров, или
- последний фактический аргумент НЕ совместим по присваиванию с типом (массива) последнего формального параметра.
Если вам интересно, это поведение указано вJLS в разделе 15.12.4.2 .
Итак ... мое решение работает путем форсирования неварадикальной интерпретации и явного построения необходимого массива.Решение @ Джона работает путем принудительного правильного варадического толкования.