2

I faced unexpected behavior while working with Nashorn.

Java class:

public class JavaClass {

    public String method(String str, Integer i) {
        return "Method a";
    }

    public String method(String... args) {
        return "Method b";
    }
}

JS script:

print(javaClass.method("str1", 2));
print(javaClass.method("str1", "str2"));
print(javaClass.method("str1", "str2", "str3"));

Execute following code:

JavaClass javaClass = new JavaClass();
System.out.println("Java call:");
System.out.println(javaClass.method("str1", 2));
System.out.println(javaClass.method("str1", "str2"));

System.out.println("JS call:");
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("nashorn");
engine.put("javaClass", javaClass);
engine.eval(script);

It will return following output:

Java call:
Method a
Method b
JS call:
Method a
Method a
Method b

JS second result looks incorrectly. I expect same result as in Java but method A gets called and instead of "str2" we get integer "0" . Also we can see that method call works fine if we change argument count.

Is it expected behavior of nashorn? Maybe I do something wrong? Or is it a bug?

0 Answers0