Nit*_*esh 5 java lambda rhino nashorn java-scripting-engine
我有一个以下类,其中一个类型为Long
package com.nm.poc;
public class JSLong{
private Long longValue;
public Long getLongValue() {
return longValue;
}
public void setLongValue(Long longValue) {
this.longValue = longValue;
}
public Long testLongValue(Long longValue){
return longValue;
}
}
Run Code Online (Sandbox Code Playgroud)
我按照以下方式从JavaScript调用方法testLongValue
package com.nm.poc;
import java.util.function.Consumer;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
JSLong jsLong = new JSLong();
//WORKS
engine.put("jsLong", jsLong);
engine.eval("print(jsLong.testLongValue(20))");
//Throws ClassCast Integer to Long
engine.put("jsLong2", (Consumer<Long>)jsLong::testLongValue);
engine.eval("print(jsLong2(20))");
}
}
Run Code Online (Sandbox Code Playgroud)
engine.eval("print(jsLong.testLongValue(20))"); 作品
engine.eval("print(jsLong2(20))"); 抛出类抛出异常
我可以engine.eval("print(jsLong2(20))");为Long类型工作吗?
异常跟踪
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
at jdk.nashorn.internal.scripts.Script$1$\^eval\_.:program(<eval>:1)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:449)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
at javax.script.AbstractScriptEngine.eval(Unknown Source)
at com.nm.poc.Main.main(Main.java:20)
Run Code Online (Sandbox Code Playgroud)
首先:Consumer代表不返回任何值的方法/函数。为了打印返回值,您应该使用 Function。
无论如何,使用 Function 都会导致同样的异常。
//Throws ClassCast Integer to Long
engine.put("jsLong2", (Function<Long, Long>)jsLong::testLongValue);
engine.eval("print(jsLong2(20))");
Run Code Online (Sandbox Code Playgroud)
Nashorn 代码中的某处必须有显式转换,该转换对 int/long 有效,但显然对 Integer/Long 无效。
为了使您的示例有效,您可以使用 LongUnaryOperator。
//This works
engine.put("jsLong2", (LongUnaryOperator)jsLong::testLongValue);
engine.eval("print(jsLong.testLongValue(20))");
Run Code Online (Sandbox Code Playgroud)
LongUnaryOperator 使用原始 long 类型而不是 Long 类,以便它可以转换为整数或从整数转换。
您应该注意,JS 中没有 64 位整数,因此通过 Nashorn 向 js 传递 long 可能会导致一些问题:
Java 8/Javascript (Nashorn) 长互操作性
| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |