我试图弄清楚如何将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并摆脱了该参数,并且它起作用了。

关于我可能做错了什么的任何想法?

最佳答案

好的-事实证明,Forge可能一直是罪魁祸首。

Forge通过更改类加载器来做一些奇怪的事情,因此Java可能还没有将我的JS函数自动更改为我的EventFunction Functional Interface类型(或类似的东西)。

无论如何-我找到了一个“解决方案”-我使用了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

感谢您的帮助!

07-27 22:58