Others are more expert than I but I believe the difference is that f1/f2 
invokes are using hard Java Objects and f3/f4 invokes are using MethodHandles 
with generic arguments.

> On May 16, 2017, at 3:36 PM, xu qingyi <bphan...@live.com> wrote:
> 
> thx, Jim, I hava  tried your solution and  it  works. but  it  needs  to 
> invoke java method so  it's more  complex. After all, what's the different 
> between  f1, f2 and  f4.
> 
> 2017年5月17日 上午2:28,"Jim Laskey (Oracle)" <james.las...@oracle.com>写道:
> It could have inferred that you meant to pass in a single element object 
> array. Nashorn needs a bit more to determine that you wanted to convert to an 
> java object array.
> 
>         System.out.println(nashorn.eval("var ObjectArray = 
> Java.type('java.lang.Object[]'); f4(Java.to([1,2], ObjectArray))"));
> 
> or more simply
> 
>         System.out.println(nashorn.eval("f4(Java.to([1,2]))"));
> 
> Generally, Nashorn only automatically converts primitive types.
> 
> 
> — Jim
> 
> 
> 
> 
> > On May 16, 2017, at 3:03 PM, qiyi <bphan...@gmail.com> wrote:
> > 
> > Hi, all, I'am trying to add a function to nashorn engine's bindings, and
> > these methods I have tried:
> > 
> > public class MyFunction implements Function<Object[], Object> {
> > 
> >    @Override
> >    public Object apply(Object[] objects) {
> >        return Arrays.toString(objects);
> >    }
> > 
> >    public Object f2(Object[] objects) {
> >        return Arrays.toString(objects);
> >    }
> > 
> >    public Object f3(Object object) {
> >        return object;
> >    }
> > 
> >    public Object f4(Object[] objects) {
> >        return Arrays.toString(objects);
> >    }
> > 
> > 
> >    public static void main(String[] args) throws ScriptException {
> >        MyFunction myFunction = new MyFunction();
> > 
> >        ScriptEngineManager manager = new ScriptEngineManager();
> >        ScriptEngine nashorn = manager.getEngineByName("nashorn");
> >        Bindings bindings = nashorn.getBindings(ScriptContext.ENGINE_SCOPE);
> > 
> >        bindings.put("f1", myFunction);
> >        bindings.put("f", myFunction);
> >        bindings.put("f3", (Function<Object, Object>) myFunction::f3);
> >        bindings.put("f4", (Function<Object[], Object>) myFunction::f4);
> > 
> >        System.out.println(nashorn.eval("f1([1,2])")); // run ok, ret: [1,2]
> >        System.out.println(nashorn.eval("f.f2([1,2])")); // run ok, ret: [1, 
> > 2]
> >        System.out.println(nashorn.eval("f3(\"f3\")")); // run ok, ret: f3
> >        System.out.println(nashorn.eval("f4([1,2])")); // run fail,
> > ClassCastException: ScriptObjectMirror cannot be cast to
> > [Ljava.lang.Object
> >    }
> > }
> > 
> > 
> > The problem is the f4 function, this method pointer receive Object[]
> > parameter and nashorn will throw exception with ClassCastException.
> > 
> > But why nashorn could not infer the parameter type and auto convert
> > the js array to java array, will it be a bug of nashorn
> 
> 

Reply via email to