у меня есть экземпляр этого класса Java, доступной в моей программе JavascriptRhino: Java числа не ведут себя как числа Javascript
public class ContentProvider {
public Object c(int n) {
switch (n) {
case 1: return 1.1;
case 2: return 2.2;
case 3: return 3.3;
case 4: return "4";
case 5: return new java.util.Date();
}
return null;
}
}
Это код внутри основной():
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
engine.put("ctx", new ContentProvider());
res = engine.eval("ctx.c(1)");
System.out.printf("rhino:> %s (%s)%n"
, res
, res != null ? res.getClass().getName() : null
);
простое выражение ctx.c(1)
печатает:
rhino:> 1.1 (java.lang.Double)
Теперь вот что происходит с ctx.c(1) + ctx.c(2)
:
rhino:> 1.12.2 (java.lang.String)
И наконец (ctx.c(1) + ctx.c(2)) * ctx.c(3)
:
rhino:> nan (java.lang.Double)
Rhino выполняет конкатенацию вместо чисел арифметика! Следующая программа работает, как и ожидалось, вместо этого:
engine.put("a", 1.1);
engine.put("b", 2.2);
engine.put("c", 3.3);
res = engine.eval("(a + b) * c");
Выходы:
rhino:> 10,89 (java.lang.Double)
О мой бог, кто-то на самом деле использовали «Java» и тег «JavaScript» вместе * правильно *! – immibis
Но почему бы просто не попробовать 'engine.eval (" typeof ctx.c (1) ")' и посмотреть, что JavaScript считает типом? – immibis
typeof ctx.c (1) = объект – lunicon