Array であれ~?

Cast to Array というエントリがあった。一見正常に見える Array へのキャストが失敗したよ、という話。

対応するグローバル変換関数を持つプリミティブデータ型を、同名のキャスト演算子でオーバーライドすることはできません。 グローバル変換関数には、キャスト演算子よりも高い優先度が割り当てられているためです。 たとえば、Array() 変換関数はキャスト演算子よりも高い優先度を持つため、Array にキャストすることはできません。

と、Flash のヘルプにもあるように、キャストする前に Array のコンストラクタが呼ばれてしまう。 その為、キャストしようと思って引数に与えた物が 0 番目の要素になった、新しい配列が返される。 そもそも、配列にキャストするシチュエーションてあるのかな?

型キャストの話でもう一つ。上記エントリが Flash casting weirdness を参照している。 Java スタイルのキャストでは、当たり前ですが動きませんよ、言っている。けど、コンパイルエラーも出ていない。

Hoge クラスを作り、いろいろやってみる。

class Hoge {
  private var name:String;
  function Hoge(name:String) {
    this.name = name;
    trace("私の名前は " + this.name);
  }
}

var h1:Hoge = new Hoge("test");
//私の名前は test
trace(h1);
//[object Object]
//var h2:Hoge = (Hoge)h1;
//コンパイルエラー
var h2:Hoge = (Hoge)(h1);
//私の名前は [object Object]
trace(h2);
//undefined

Java スタイルのキャストではやっぱりコンパイルエラーが出た。 (Hoge)(h1) とするとエラーが出ないけど、ただ単に h1 を引数として Hoge クラスのコンストラクタが呼ばれているだけだった。 勿論、new していないからメモリに確保されずに h2 は undefined になる。変なの。