使用Nashorn将Javascript函数作为函数接口类型传递给Java方法
Pass Javascript function as Functional Interface type to Java method with Nashorn
我正试图弄清楚如何将我的Javascript函数传递给我的Java方法,以便在运行时调用它。
我有以下Java方法签名:
public static void createBlock(String domain, String name, String eventType, EventFunction eventHandler)
我用Javascript这样称呼它:
function main() {
BlockManager.createBlock('sarah-egg', 'enderBlock', 'breakBlock', func);
}
function func (event) {
event.world.createExplosion(null, event.pos.getX(), event.pos.getY(), event.pos.getZ, 10, true);
}
我制作了我的Java函数接口EventFunction,如下所示:
package com.learntomod.event;
@FunctionalInterface
public interface EventFunction<T> {
void fun(T t);
}
当我运行它时,我得到了这个错误:
Cannot cast jdk.nashorn.internal.objects.ScriptFunctionImpl to com.learntomod.event.EventFunction
我尝试将EventFunction更改为Runnable并去掉该参数,结果成功了。
你知道我可能做错了什么吗?
OK-所以事实证明Forge可能一直是罪魁祸首。
Forge在更改类加载器方面做了一些不稳定的事情,因此Java可能没有将我的JS函数自动更改为EventFunction函数接口类型(或类似的类型)。
在任何情况下-我找到了一个"解决方案"-我使用https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html-它是Java Util的一部分,由于Runnable起作用,我们决定尝试Function(它接受一个参数)和。。。成功了!
现在,我的自定义块在你破坏它们时会爆炸;)https://www.youtube.com/watch?v=7IJVeC48z6I&feature=youtu.be
谢谢你们的帮助!
相关文章:
- 如何确保函数/方法参数为certian类型
- Javascript中对象中的函数方法
- Object.assign(),函数方法和内存使用
- 我应该在原型上还是在新创建的实例上调用构造函数方法
- Angular promise回调不是在构造函数方法内部触发,而是在对象文本方法中触发
- 如何使用 Karma、Jasmine 和 Istanbul 指定测试应涵盖哪些函数/方法
- 在ES2015中定义一个类,构造函数方法是什么以及为什么它是必不可少的
- 如何调用通过它传递不同 ID 的函数方法
- Sencha ExtJs 为什么从“构造函数”方法返回“this”
- 这个 JavaScript 函数方法调用了什么
- 如何在 javascript 中从子原型调用父类的构造函数方法
- 是否仍可访问被覆盖的函数/方法
- 在构造函数之外更改 JavaScript 中的构造函数方法
- 这种实例化构造函数方法的风格是什么
- 如何在 JavaScript 中使用继承与构造函数方法一起使用 返回具有私有属性的对象文本
- 我的javascript构造函数方法以文本形式返回整个方法,而不是预期的返回值
- 如何在事件中将变量传递给构造函数方法
- 如何限制用户在ui ace编辑器中只能编写一个javascript函数(方法)
- 打印任何java应用程序的函数/方法调用序列
- 如何在jQuery语句中使用Javascript构造函数方法