import java.util.function.Function;

import javax.script.ScriptContext;
import javax.script.ScriptException;

import jdk.nashorn.api.scripting.NashornScriptEngine;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;

public class JI9042415 {

	public static void main(String[] args) throws ScriptException, NoSuchMethodException {
		System.out.println(System.getProperty("java.version"));

	    NashornScriptEngine engine = (NashornScriptEngine) new NashornScriptEngineFactory().getScriptEngine();
	    engine.setBindings(engine.createBindings(), ScriptContext.GLOBAL_SCOPE); //Null by default
	    
	    engine.eval("function proxy(a){return Java.type('JI9042415').bar(a);}",engine.getBindings(ScriptContext.GLOBAL_SCOPE));
	    engine.eval("function withoutProxy(){return Java.type('JI9042415').bar(m);}",engine.getBindings(ScriptContext.ENGINE_SCOPE));
	    engine.eval("function withProxy(){return proxy(m);}", engine.getBindings(ScriptContext.ENGINE_SCOPE));
	    	
	    engine.eval("function m(a){return a;}", engine.getBindings(ScriptContext.ENGINE_SCOPE));
	    
	    engine.invokeFunction("withoutProxy"); //Works
	    
	    engine.invokeFunction("withProxy"); //ClassCastException
	}

	public static void bar(Function<String, Void> f){
        f.apply("-");
    }
}
