继承的静态方法在Java 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

我有一个实用程序类,它将功能添加到更通用的实用程序类中。在Java中,一切都按预期工作,但Java的JavaScript引擎Nashorn中的行为是不同的

有关说明,请参见以下代码:

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文档中搜索合适的类。