3

考虑代码:

示例 1

var Executors = java.util.concurrent.Executors;
var executor = Executors.newCachedThreadPool();
var fork = function (callable) {
    // Clarify Runnable versus Callable overloaded methods
    executor['submit(java.util.concurrent.Callable)'](callable);
};

fork(function(){ ... }); //ok

这行得通。

但这不起作用:

示例 2

var Executors = java.util.concurrent.Executors;
var executor = Executors.newCachedThreadPool();
var fork = executor['submit(java.util.concurrent.Callable)'];

fork(function(){ ... }); //fails, NullPointerException

我假设,这是因为fork这里不是一个 JS Function 实例,它实际上是一个实例jdk.internal.dynalink.beans.SimpleDynamicMethod

我尝试使用fork.apply(executor,function() { ... });,但很自然,SimpleDynamicMethod 没有apply.

实际上,为什么示例 2 不起作用,而示例 1 起作用?

这仅仅是 Nashorn 的一项福利吗?是否有比示例 1 更好的方法来定义 fork() 函数?

更新

在示例 2 中,

print(typeof fork);报告function

print(fork)报告[jdk.internal.dynalink.beans.SimpleDynamicMethod Future java.util.concurrent.AbstractExecutorService.submit(Callable)]

例外是(第 13 行阅读fork(function() {

Exception in thread "main" java.lang.NullPointerException
    at jdk.nashorn.internal.scripts.Script$\^eval\_._L5(<eval>:13)
    at jdk.nashorn.internal.scripts.Script$\^eval\_.runScript(<eval>:5)
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:527)
4

3 回答 3

3

不幸的是,目前您不能将bindapplycall与 POJO 方法一起使用。我想将其添加为未来的增强功能。在上述示例中,您目前可以做的最好的事情是:

executor['submit(Callable)'](function() { ... })

请注意,虽然通常对属性的索引访问(使用[]运算符)效率低于属性名称访问(使用.运算符),但 Nashorn 使用字符串文字识别索引访问并将其与属性名称访问一样有效,因此您不要在这里减速,只是一点视觉噪音。在上述情况下,它实际上最终会直接链接到执行器的虚拟方法。

说到视觉噪音,您不必完全符合条件java.util.concurrent.Callable。当参数类型的非限定名称足以消除重载的歧义时(几乎总是如此),您可以只使用非限定名称,而不管它在哪个包中(也适用于您自己的类)。

于 2014-03-19T21:47:22.897 回答
1

问题是您缺少通话中的接收者“执行者”。通常,“获取”Java 函数仅适用于静态 Java 函数。例如:

jjs> var abs = java.lang.Math.abs;
jjs> abs(-10);
10

在您的示例中,我们可以将 fork 绑定到 executor 并使其等效为静态。此支持当前不存在。如果从类中“获取”,我们可能应该支持将接收器添加为第一个参数。将提交未来版本的增强请求。

于 2013-11-13T20:16:45.013 回答
0

亚历克斯,

在示例 1 中,var fork是一个返回数组的函数executor。在示例 2 中,var fork是一个数组。这就是为什么你不能使用()and apply

对你有用fork[0](function(){...})吗?

谢谢

于 2013-10-25T15:58:16.923 回答