rjbタグ新設。jdk1.6.0+rjb_trunkで以下のコードが実行できる。どう考えても呼出前にIntegerとかに変換してるからなのだが、ずっとこんな感じだっけ?
def test_autoboxing assert_equal(false, Rjb::primitive_conversion) test = import('jp.co.infoseek.hp.arton.rjb.Test') tr = import('java.util.TreeMap') tree = tr.new tree.put(1, 128) tree.put(2, 256) test.setSortedMapS(tree) assert_equal 128, tree.get(1).intValue assert_equal 256, tree.get(2).intValue end
Hashのキー,値にFixnumがそのまま使える点に注目。
あんまり関係ないけどさ、以下は覚えておくべき。
Integer.hashCode():この Integer オブジェクトが表すプリミティブ型 int 値に等しい。
Integer.equals():結果が true になるのは、引数が null ではなく、このオブジェクトと同じ int 値を含む Integer オブジェクトである場合だけです。
Collections Framework インタフェース内の多数のメソッドは、equals メソッドとの関連で定義されます。たとえば、containsKey(Object key) メソッドの仕様は、「このマップコレクションに (key==null ?k==null : key.equals(k)) を満たすキー k が含まれる場合にのみ、true を返す」というものです。."この仕様は、「null 以外の引数 key を使用して Map.containsKey を呼び出すと、キー k で key.equals(k) が呼び出される」と理解すべきではありません。実装は、最初に 2 つのキーのハッシュコードを比較するなど、equals 呼び出しを回避するための最適化を自由に実装できます。(Object.hashCode() 仕様では、等価ではないハッシュコードを保持する 2 つのオブジェクトは等価ではないことが保証されます)。通常、さまざまな Collections Framework インタフェースの実装で、実装者が適切と判断するなら、基盤となる Object メソッドの指定された動作を自由に利用できます。