シーケンスをキャストしてはまった事

今日はページングコンポーネントの紹介か、アドレス帳アプリをサンプルで公開しようかと思っていたのですが、シーケンスのキャスト関連で嵌ってしまいました。まずはこちらのスクリプトをご覧ください。

var obj:Object = [1, 2];
var sequence:Object[] = obj as Object[];
println(sequence.size()); // => 1!

オブジェクトとしてはサイズ2のシーケンスが1つ生成されており、変数objに代入していますが、この時に型をObjectとしています。その参照を再度Objectのシーケンスでキャストしてみると、サイズが1になってしまいます。
Javaで書けばこんな感じですが、当然ながら結果は2です。

Object obj = new int[]{1, 2};
int[] array = (int[]) obj;
System.out.println(array.length); // => 2

どうもJavaFXではコンパイルされたシーケンスはcom.sun.javafx.runtime.sequence.ArraySequenceクラスのインスタンスとして処理されるようですが、このクラスがシーケンスで処理されるとサイズ1でArraySequenceのインスタンスを保持するシーケンスになる・・・そんな状況です。

現時点での回避方法は次のようにします。

sequence = for (item in (obj as com.sun.javafx.runtime.sequence.ArraySequence)) item;
println(sequence.size()); // => 2

JavaFXのfor式はJavaと同様にIteratableなオブジェクトならばコンパイラを通るようなので、ArraySequenceにキャストしてからシーケンスを生成しなおす(それもArraySequenceですけど・・・)わけです。

こんな箇所ではまるほどJavaFXをやっている人はあまりいないとは思いますが、1.2.1ではそんな状況なので置きを付けください。