Реализовать тип java с перегруженными методами в Nashorn

Есть ли способ реализовать этот интерфейс в Nashorn с отдельным кодом для обоих методов?

public interface Test {
    void methodA(int a);
    long methodA(long b);
}

Как-то так будет реализовывать оба метода:

var x = new whatever.Test {
    methodA: function (a) {
        print(a + ", type: " + (typeof a)); // type is number, so I don't even know what method was actually called
    }
};

person GotoFinal    schedule 07.04.2018    source источник


Ответы (1)


Нет, нет.

Поскольку в JavaScript нет понятия перегруженных методов, все перегруженные версии Java будут использовать одну и ту же функцию JavaScript. Если вам требуется другое поведение, вам придется попытаться дифференцировать себя на основе количества и типов аргументов. Если у вас есть

methodA(Object x) methodA(Object x, Object y)

вы можете иметь

function methodA(x, y)

и вы можете обнаружить, что, например. typeof(y) == "undefined", то была вызвана версия с одним аргументом. Кроме того, вы можете использовать массив arguments повсюду.

Однако в вашем случае, поскольку JavaScript имеет только один числовой тип и не имеет отдельных целочисленных типов, как int, так и long становятся числом (так что это будет float, double, byte и short), поэтому на самом деле нет никакого способа определить, какая перегрузка была вызвана, кроме возможно, тестирование диапазонов значений.

person Attila Szegedi    schedule 09.04.2018
comment
Есть возможность вызвать выбранный java-метод из nashorm, например x['methodA(long)'](43), может быть, есть также способ установить обработчик этого метода? или при реализации? Я отмечу этот ответ как действительный на следующей неделе, если кто-то не найдет способ. - person GotoFinal; 12.04.2018