ActionScript3のキャストの謎

型の変換は、どんな言語でも厄介な部分です。
コンパイラ実装依存になる言語もあるのかな、Cはどうだったっけ。
キャストなんて使わなくて済むなら使わないに越したことはありません。
バグの温床の一つですから。

Cでオブジェクト指向書くときは、構造体のキャスト使わないと継承を書けなかったりします。
ActionScriptでは、interfaceを使ったキャストであればもちろん問題は起こりません。
しかし、僕は今までDictionary、SharedObject、Objectを使う際に面倒なキャストの問題に遭遇しました。

連想配列はASではDictionaryあるいはObjectを使って実装するので、使わざるを得ません。
SharedObjectも小さなアプリを作る場合は非常に便利なので使わざるを得ません。

ActionScript3.0の型変換には2つあります。
① (type)value
② value as type
③ var value2:type2 = value1;   // value1はtype1型

①、③の場合、実行時にキャストできない場合、例外が発生します。
②の場合、実行時にキャストできない場合、nullになります。

両方、大抵の場合、アプリが落ちてしまうので注意が必要です。

ASのビルトインクラスにとって、Objectというのは継承関係でいうと最も祖先にあるクラスです。
DictionaryはObjectの直接の子であり、SharedObjectは結局Object型のメンバを使うことになるので、上記3つのクラスのキャストは、Objectのキャストがわかれば解決です。

Dictionaryのヘルプを見るとこう書いてあります。
http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/utils/Dictionary.html
「Dictionary コレクション内の Numbers のようなプリミティブ (ビルトイン) オブジェクトは、オブジェクトが通常のオブジェクトのプロパティであるときと同じように動作します。」
経験上、これはObject型についても言えます。

つまり、
var o:Object = 1;  intのリテラルが入る
var i:int = o;
は問題なく動きます。

今回フットサル戦術ボードで
var o:Object = new Object();
o.saveData = saveDataBuffer;   //saveDataBufferはVector.>インスタンスの参照
としてましたが、デバッガで見ると
oの型はVector.>となっています。
ただし、配列の中身を見ると、xメンバとyメンバに(どちらもNumber型)値がちゃんと入っています。
Number型のようなプリミティブ型の情報であれば、型の情報は記憶してくれている、という訳ですね。

var p:Point = o.saveData[i][j]
みたいなことをやると実行時エラーになります。
ObjectからPointへのキャストはできません。
でも、
var p:Point = new Point(o.saveData[i][j].x, o.saveData[i][j].y);
はOK。
つまり、キャスト可能なのはプリミティブ型だけのようです。

何かこれを説明している資料が欲しいですが見つかってません。
Objectクラスのソースって見れるんだっけ?

SharedObjectに配列データを格納すると取り出しが結構面倒です。
僕の得た教訓としては、キャストで詰まったらデバッガでデータを確認してキャスト可能なところまでデータを分解する、というものですかね。