« #Calc 取扱説明書 | トップページ | 大学教授、円周率を計算し過ぎて逮捕 ほか »

2006年3月31日 (金)

配列にまつわる型

キャストについて - Java Solution のトピックに 30 を超える返答が。二日足らずで 5 ページ目に達したのは珍しい。確かに配列の型の扱いは初心者が嵌りやすいところだ。問題を複雑にしている要素を列挙すると、

  • 配列はそれ自身がオブジェクトであること。(配列の各要素は配列オブジェクトのフィールドのようなものである)
  • Object[] ary = new String[3]; のようにアップキャストが可能であること。それでいて String[] クラスは Object[] クラスの子クラスではない。
  • コンパイル時の型と実行時の型を区別しなければならないこと。

なんにせよ、普通のオブジェクトの型に関する理解がなおざりなまま配列の型が理解できるはずがない。一連のやり取りを見る限り OZ さんは自分の理解度に対して手を広げすぎだと思う。

それにしても、Java にしろ C# にしろ配列の型がジェネリックでないのが残念なところ。もともとジェネリックがなかったところに後からジェネリックを導入したらこうなるのも仕方がないか。

理想としては、Object[] ary = new String[3]; のようなキャストはできず、コンパイルの段階でエラーになるのが望ましい。それは List<Object> list = new List<String>(); が不可なのと同じことだ。つまり Object[] というのは意味合いとしては Array<Object> と扱われるべきなのだ。

こうしておけば ary[0] = new Object(); で ArrayStoreException/ArrayTypeMismatchException が出るなどというのも解決できる。こういう型のチェックは実行時ではなくコンパイル時に済ましておくべきなのだ。

|

« #Calc 取扱説明書 | トップページ | 大学教授、円周率を計算し過ぎて逮捕 ほか »

コメント

配列を covariant にしてしまった、ってのはよく指摘される初期設計における Java の失敗のひとつですね。しかもこれは修正される見込みがなさげなのががががが

投稿: KM | 2006年4月21日 (金) 13時44分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/169172/9355062

この記事へのトラックバック一覧です: 配列にまつわる型:

« #Calc 取扱説明書 | トップページ | 大学教授、円周率を計算し過ぎて逮捕 ほか »