Я экспериментировал с Nashorn и получил некоторые странные результаты в отношении возвращаемых типов eval()
.Почему оптимистическая печать Нашорна дает непредсказуемые результаты?
// calculator.js
var add = function(a, b) {
return a + b;
}
И следующий Java-код:
// CalculatorTest.java
import java.io.InputStreamReader;
import javax.script.*
import org.junit.*
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
public class CalculatorTest {
ScriptEngine nashorn;
@Before
public void setup() throws ScriptException {
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
nashorn = factory.getScriptEngine("–optimistic-types=true");
nashorn.eval(new InputStreamReader(
getClass().getClassLoader().getResourceAsStream("calculator.js")));
}
@Test
public void addViaInvokeFuntion() throws Exception {
Object result = ((Invocable) nashorn).invokeFunction("add", 2, 3);
Assert.assertEquals(5.0, result);
}
@Test
public void addViaSimple() throws Exception {
Object result = nashorn.eval("2+3");
Assert.assertEquals(5, result);
}
@Test
public void addViaMoreComplexEval() throws Exception {
Object result = nashorn.eval(
"var anotherAdd = function(a, b) {\n" +
" return a + b;\n" +
"};\n" +
"anotherAdd(2, 3);");
Assert.assertEquals(5L, result);
}
}
Почему эти тесты успеха именно таким образом?
Есть ли способ «предсказать» типы возврата Nashorn?
Должно ли оптимистичное типирование делать именно это?
Я второй этот вопрос, когда я наткнулся на это вместе с Майклом. Чтобы быть точнее: почему возвращается «Integer», если операция или функция вызывается непосредственно с помощью «eval()» и почему возвращается «Double», если функция вызывается из внешнего js-файла? Я полностью понимаю, что 'Number' следует использовать, а в JS все - поплавковый. Но помимо этого, почему один раз «Integer» вернулся, а другой - «Двойной»? – dasniko