投稿日: 2015/12/12 14:30:56
Rhinoと異なり、Nashornは文字列表現のほとんどをjava.lang.Stringとみなせるようになりました。ただしNashornユーザーズ・ガイド日本語版にある通り、"2つの文字列を連結する場合は、jdk.nashorn.internal.runtime.ConsString"が返されます。さらにややこしいことに、jjsを対話モードで起動して文字列の連結結果を確認すると、java.lang.Stringが返されます。
1-1. 実行するスクリプト(consString.js)
function assertEq(f,x) {var r=f();if(r!==x)throw new Error(f.toSource()+", expected=${x}, actual=${r}");}var JString = Java.type("java.lang.String");var ConsString = Java.type("jdk.nashorn.internal.runtime.ConsString");var s = "a";assertEq(function() ("a" + "b").getClass(), JString.class);assertEq(function() (s + "b").getClass(), ConsString.class);s += 10;assertEq(function() s.getClass(), ConsString.class);print("done.");1-2. jjsで実行する
>jjs -scripting -fullversion consString.jsnashorn full version 1.8.0_66-b18done.2. jjsの対話モードで文字列の連結結果を確認すると、全てjava.lang.Stringが返される
>jjs -scripting -fullversionnashorn full version 1.8.0_66-b18jjs> var s = "a"; print(s.class);class java.lang.Stringjjs> print((s + "b").class);class java.lang.Stringjjs> s += 10; print(s.class);class java.lang.String