Cast/boxing/unboxing of numbers Java 9
Hannes Wallnöfer
hannes.wallnoefer at oracle.com
Tue Mar 27 18:18:00 UTC 2018
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.oliveira at 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.wallnoefer at 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.oliveira at 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
>
>
>
>
More information about the nashorn-dev
mailing list