继承的静态方法在Java Nashorn中不可用
我有一个实用程序类,它将功能添加到更通用的实用程序类中。在Java中,一切都按预期工作,但Java的JavaScript引擎Nashorn中的行为是不同的 有关说明,请参见以下代码:继承的静态方法在Java Nashorn中不可用,java,static-methods,nashorn,Java,Static Methods,Nashorn,我有一个实用程序类,它将功能添加到更通用的实用程序类中。在Java中,一切都按预期工作,但Java的JavaScript引擎Nashorn中的行为是不同的 有关说明,请参见以下代码: package com.test; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class Test { public static class A { public
package com.test;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Test {
public static class A {
public static void sayHello() {
System.out.println("Hello World");
}
}
public static class B extends A {
public static void sayBye() {
System.out.println("Goodbye cruel world");
}
}
public static void main(String[] args) throws Exception {
// Java's Behavior
A.sayHello(); // Works
B.sayBye(); // Works
B.sayHello(); // Works
// Java Nashorn's Behavior
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("nashorn");
engine.eval("var A = Java.type('com.test.Test.A')");
engine.eval("var B = Java.type('com.test.Test.B')");
engine.eval("A.sayHello()"); // Works
engine.eval("B.sayBye()"); // Works
engine.eval("B.sayHello()"); // Fails
}
}
有没有办法使
B.sayHello()
与Nashorn引擎一起工作?是的,静态方法只能在方法的确切声明类上调用(而不能在其子类上调用)。这是为了简化dynalink链接器(由nashorn使用)而做出的设计选择。B.sayHello()
无论如何都不应该使用。类不是对象。@JimmyB您是否建议不应继承静态方法?如果是这样,我同意你的看法。好的,通常我会同意,但为了给我的情况提供更多的上下文:例如,在父实用程序类Utils#getDistance(PointF,PointF)
(实用程序类用于多个项目)中有一个静态方法,在子实用程序类中我有一个方法Utils#getDistance(Entity,Entity)
首先从实体中检索位置,然后返回距离。因此,我不希望有一个类Utils
和SpecificUtils
或任何你当时调用它的东西,使用相同的方法集,只有不同的参数。只要始终在声明它的类上调用静态方法即可。如果你想sayHello
,你可以调用A.sayHello()
。在我的例子中,使用脚本语言的目的是要有一个简单的系统,允许玩家更改游戏的某些部分。为此,我希望它尽可能简单,如果方法在逻辑上是等价的,我不希望我的玩家必须在API文档中搜索合适的类。