在Java和(Rhino)Javascript之间传递常见类型

The*_*aul 8 javascript java rhino type-conversion

我不清楚在使用(Mozilla)Rhino时如何在Javascript和Java之间转换类型的规则.

文档中有一些细节String:

重要的是要记住Java字符串和JavaScript字符串不一样[...] Rhino在减少两种类型之间的差异方面提供了一些帮助.首先,您可以将JavaScript字符串传递给需要Java字符串的Java方法,Rhino将执行转换.实际上,我们在上一个示例中调用java.lang.String构造函数时看到了这个特性.如果java.lang.String类尚未定义它们,Rhino也会使JavaScript方法可用于Java字符串

但其他人呢?如果我将javascript Number传递给期望的Java方法int,double(Integer或者Double)它会被转换吗?怎么样long/ Long?(它不适合a Double,因此不适合JS编号?

返回这些值的Java方法怎么样?

然后是Boolean/ boolean.是JS常量truefalse转换,并从相应的Java值?我见过像这样的代码

java.lang.Boolean.TRUE.booleanValue()
Run Code Online (Sandbox Code Playgroud)

从JS使用,所以至少有些人认为不是.

我看过Mozilla Rhino的文档,但是如果我错过了一些明显的东西,请指出.

pin*_*33n 5

以下是将JavaScript类型转换为Java类型的方法:http://www-archive.mozilla.org/js/liveconnect/lc3_method_overloading.html#InvocationConversion.

试试吧:

$ java -cp js.jar org.mozilla.javascript.tools.shell.Main

js> new java.lang.Integer(12345)
12345
js> new java.lang.Integer(12345) == 12345
true

js> new java.lang.Double(12345.12345)
12345.12345

js> new java.lang.Long(9223372036854775807)                 
js: Cannot convert 9223372036854776000 to java.lang.Long
js> 9223372036854775807
9223372036854776000
js> new java.lang.Long("9223372036854775807")
9223372036854775807
js> new java.lang.Long("-9223372036854775808")
-9223372036854775808

js> new java.lang.Boolean(true)
true
js> new java.lang.Boolean(true) == true
true
js> new java.lang.Boolean(true) == false
false
js> java.lang.Boolean.TRUE.booleanValue() == true
true
js> java.lang.Boolean.FALSE.booleanValue() == false
true
Run Code Online (Sandbox Code Playgroud)

UPD

不幸的是,我找不到任何关于JavaScript-from-Java类型映射的文档.但是教程显示JavaScript对象作为Java Object实际上可以是Doubles,Booleans,Functions(用于JavaScript函数;也用于实现Scriptable)或Scriptables(用于对象)插入到上下文中并从中检索.

使用此代码片段可能会获得JavaScript-Java类型映射参考:

https://gist.github.com/1089320#file_java_script_java_type_mapping.textile

至于LiveConnect兼容性.如果你指的是这个脚注:

从JavaScript调用Java的能力最初是作为名为LiveConnect的Netscape浏览器技术的一部分实现的.但是,由于该技术还包含与浏览器插件的通信,并且由于在Rhino中从Java调用JavaScript的方式完全不同,因此本文中不会使用该术语.

我认为使用Java的JavaScript与LiveConnect规范不同.使用JavaScript中的Java应该是相同的.