配列にまつわる型
キャストについて - 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 が出るなどというのも解決できる。こういう型のチェックは実行時ではなくコンパイル時に済ましておくべきなのだ。
| 固定リンク
| コメント (1)
| トラックバック (0)