使用Nashorn将Javascript函数作为函数接口类型传递给Java方法

Pass Javascript function as Functional Interface type to Java method with Nashorn

本文关键字:函数 方法 Java 接口类型 Nashorn Javascript 使用      更新时间:2023-09-26

我正试图弄清楚如何将我的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

谢谢你们的帮助!