我试图弄清楚如何将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
感谢您的帮助!