[Nashorn] 文字列とConsString

投稿日: 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.js
nashorn full version 1.8.0_66-b18
done.

2. jjsの対話モードで文字列の連結結果を確認すると、全てjava.lang.Stringが返される

>jjs -scripting -fullversion
nashorn full version 1.8.0_66-b18
jjs> var s = "a"; print(s.class);
class java.lang.String
jjs> print((s + "b").class);
class java.lang.String
jjs> s += 10; print(s.class);
class java.lang.String