Disabling optimistic-types will make it behave like JDK 8 and shouldn’t have 
any side effects. In fact, you can make JDK 8 behave like JDK 9 by passing 
-ot=true.  

Hannes


> Am 27.03.2018 um 19:56 schrieb Paulo Oliveira <paulo.olive...@ifood.com.br>:
> 
> Hello,
> 
> Firstly, thanks for the quick answer.
> I tried some parameters however did not work, I suppose I miss typed 
> something.
> Disabling optimistic-types will work just like JDK 8 or may have some other 
> side effect  ?
> 
> 
> Em ter, 27 de mar de 2018 às 12:51, Hannes Wallnöfer 
> <hannes.wallnoe...@oracle.com> escreveu:
> Hi Paulo,
> 
> What you are observing is a side effect of the optimistic-types feature, 
> which was shipped with JDK 8u, but only became enabled by default with JDK 9. 
> It is unfortunate that this affects observable behaviour in this case, but 
> conversion between JavaScript and Java types is quite difficult and it’s hard 
> to avoid border cases like this.
> 
> As a workaround you can disable this feature using the nashorn.args system 
> property:
> 
> java -Dnashorn.args=-ot=false
> 
> Hannes
> 
> 
> > Am 26.03.2018 um 23:27 schrieb Paulo Oliveira <paulo.olive...@ifood.com.br>:
> >
> > Hello,
> >
> > Testing some nashorn scripts on java 9 I got some unexpected behavior.
> > The code:
> >
> > import java.util.Arrays;
> > import java.util.List;
> > import javax.script.Invocable;
> > import javax.script.ScriptEngine;
> > import javax.script.ScriptEngineManager;
> >
> > public class Main {
> >
> >    public static void main(String[] args) throws Exception{
> >        ScriptEngine scriptEngine = new
> > ScriptEngineManager().getEngineByName("Nashorn");
> >        scriptEngine.eval("var imports = new JavaImporter(java.lang.Integer, 
> > " +
> >                "java.lang.Long);" +
> >                "var fun1 = function(longs, ints, id) {" +
> >                "with(imports) {" +
> >                "print(id.getId().class);" +
> >                "print(longs.contains(id.getId()));" +
> >                "print(ints.contains(id.getId()));" +
> >                "return Long.valueOf(1);" +
> >                "}" +
> >                "};");
> >        Invocable invocable = (Invocable) scriptEngine;
> >
> >        List<Long> longs = Arrays.asList(1L, 2L);
> >        List<Integer> ints = Arrays.asList(1, 2);
> >        Teste teste = new Teste(1L);
> >        Object result = invocable.invokeFunction("fun1", longs, ints, teste);
> >        System.out.println(result.getClass());
> >    }
> > }
> >
> > public class Teste {
> >
> >
> >    private Long id;
> >
> >    public Teste(Long id) {
> >        this.id =id;
> >    }
> >
> >    public Long getId() {
> >        return id;
> >    }
> > }
> >
> >
> > Executing the code
> > It produces:
> >
> > Java 8.161
> > class java.lang.Long
> > true
> > false
> > class java.lang.Long
> >
> > Java 9.0.4 and 10
> > class java.lang.Long
> > false
> > true
> > class java.lang.Integer
> >
> > Nashorn is changing every number that fits a Integer in Integers, even if I
> > explicit define as Long.
> > This causes a problem on List.contains, because it receives a Object, if I
> > try to verify if a long exists in a list of longs, it returns false.
> >
> > Is it a expected behavior ?
> > --
> > *Paulo Oliveira*
> > *Desenvolvedor BackEnd*
> >
> > *TEL:* +55 (11)  3634-3378
> > www.ifood.com.br
> >
> >
> >
> >
> > <https://itunes.apple.com/br/app/ifood-delivery-e-entrega-comida/id483017239?mt=8>
> > <https://play.google.com/store/apps/details?id=br.com.brainweb.ifood>
> > <https://www.facebook.com/iFood?fref=ts> <https://twitter.com/iFood>
> 
> -- 
> Paulo Oliveira
> Desenvolvedor BackEnd
> 
> TEL: +55 (11)  3634-3378
> www.ifood.com.br
> 
>        
>       
>                                        

Reply via email to