Множественные функциональные интерфейсы типы SAM не автоматически разрешены, как Nashorn (при использовании в качестве вJAVA

Программисты JAVA общаются здесь
Anonymous
Множественные функциональные интерфейсы типы SAM не автоматически разрешены, как Nashorn (при использовании в качестве в

Сообщение Anonymous »

Опубликовать проблему, которую Raseed in graaljs Repo здесь
, чтобы получить информацию -> https://github.com/oracle/graaljs/issues/911образное. Установите соответствующий метод, основанный на количестве аргументов, передаваемых из JavaScript, в отличие от Nashorn. Функциональность работала без проблем в Нашорне, и, хотя мы понимаем, что у Graaljs могут быть разные цели в области конструкции в отношении соответствия JavaScript, это автоматическое разрешение нескольких функциональных интерфейсов было полезной функцией для совместимости Java-JavaScript. Текущее поведение требует явной обработки, которая добавляет сложность в кодовую базу < /p>
graaljs.version => 23.1.2
jdk версия - 21 < /p>
Пример кода ниже. < /P>
// Functional Interfaces
@FunctionalInterface
public interface OneArgFunction {
public String apply(String arg);
}

@FunctionalInterface
public interface TwoArgFunction {
public String apply(String arg1, Number arg2);
}

// Concrete class

public class MultiFunctionAdapter implements OneArgFunction, TwoArgFunction {
@Override
public String apply(String arg) {
return "Hello " + arg;
}

@Override
public String apply(String arg1, Number arg2) {
return "Hello " + arg1 + " " + arg2;
}
}

//Test class
public class MultipleInterfaceTest {

public static void main(String[] args) throws Exception {
Context context = Context.newBuilder("js")
.allowAllAccess(true)
.allowHostClassLookup(classname -> true)
.build();
context.getBindings("js").putMember("adapter", new MultiFunctionAdapter());

// One arg works fine as it is the first implemented interface in order
String jscript1 = "adapter('world')"; // works fine
Value result1 = context.eval("js", jscript1); // prints "Hello world"
System.out.println("Result: " + result1.asString());

//Below script throws TypeError: execute onMultiFunctionAdapter failed due to: Arity error - expected: 1 actual: 2
String jscript2 = "adapter('world', 60.5)";
Value result2 = context.eval("js", jscript2); // Arity error - expected: 1 actual: 2
System.out.println("Result: " + result2.asString());
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... ke-nashorn

Вернуться в «JAVA»