Hi there,

I'm currently trying to implement an interface from JavaScript that has default implementations. Unfortunately, it's not working.

That's the code at the Java side:
    interface A {
        default void a() {
            System.out.println("a");
        }
    }
    interface B extends A {
        default void b() {
            System.out.println("b");
        }
        default void c() {
            System.out.println("c");
        }
    }

And that's the one in JavaScript:
    var B = Java.type("my.package.B");
    new B({
        b: function() {
                doMyStuff();
        }
    });

If I invoke a() on the new object, I get the following error:
java.lang.IncompatibleClassChangeError: Interface method reference: my.package.A.a(;)Z, is in an indirect superinterface of my.package.B$$NashornJavaAdapter

The same works just fine in Java, so I assume that this is an actual bug in the Nashorn implementation, as I can invoke c() without a problem.
Is this known or even accepted behavior?

Also, when I create a class of this:
public class C implements B {
}

I cannot use the following:
    var C = Java.type("my.package.C");
    new C({
        b: function() {
            doMyStuff();
        }
    });

I get this error:
javax.script.ScriptException: TypeError: Can not construct my.package.C with the passed arguments; they do not match any of its constructor signatures. in <eval> at line number 2

Removing the default methods, all is working as expected.

Kind regards,
   Axel Dörfler.

Reply via email to