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 になる。変なの。

カテゴリー: Flash   パーマリンク

コメントは受け付けていません。