• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC#2010 ArrayListに入れた要素の型)

ArrayListに異なる型のオブジェクトを格納する際のエラーについて

このQ&Aのポイント
  • こんにちは。ArrayListに異なる型のオブジェクトを格納しようとしている際にエラーが発生しています。具体的には、オブジェクトを格納したArrayListから要素を取り出そうとする際に型キャストのエラーが発生しています。
  • このエラーが発生する原因は、ArrayListはジェネリックではないので、内部的にはすべての要素がObject型として扱われるためです。そのため、格納されたオブジェクトを取り出す際には明示的な型キャストが必要となります。
  • しかし、オブジェクトの実際の型を事前に知ることができない場合や、誤った型でキャストしようとした場合には、型キャストのエラーが発生します。この場合、正しい型のオブジェクトが格納されているかどうか事前に確認する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
noname#251971
noname#251971
回答No.2

エラーメッセージを見る限り、 実際のソースコードと質問文に記載されているコードで大きく差があり、 実際には ObjList[0] には ProductA ではなく、 List<ProductA> 型のオブジェクトが格納されているように見受けられます。 要素を Add() する箇所で、ProductA 型のオブジェクトを格納しているかを確認してみてください。 なお、ArrayList クラスはまだ.NETにジェネリックが導入される前、 .NET Framework 1.1 の時代に利用されていた古いクラスです。 現在ではジェネリックによる型付き(いわゆるタイプセーフ)な List コレクションが存在します。 質問文の例ですと、共通の基底クラスである BaseObj がありますので、 ArrayList の代わりに List<BaseObj> を利用することができるかと思います。 # List<BaseObj> には BaseObj を派生した ProductA や ProductB も格納できます。 型付きにすると何が良いかというと、 今回の例のように、誤った要素を入れてしまうコードを記述すると、 コンパイルを行う時点でエラーにしてくれます。 # ArrayList のばあい、すべて object 型で型情報が無くなってしまうので、 # 間違いがあるところまで実行してみないとわかりません。 今回の問題も、ひとまず ArrayList を List<BaseObj> に変えてみると 型が合わないオブジェクトを追加する箇所でコンパイルエラーが出るかと思いますので、 すぐに問題箇所が発見できるかと思われます。

coelacanth9
質問者

お礼

ご回答ありがとうございます。 仰るとおり、投稿したコードは間違えていました。そのままコピペするとごちゃごちゃするので簡略化しようとして間違えてしまいました・・・。 そして、教えていただいたようにListでやってみると間違いが分かりました。この例だと、ArrayListにProductAを追加しなくてはならないのに、List<ProductA>を追加してしまっていました。それでエラーコードの意味も分かりました。 分かりやすい説明をしていただき、ありがとうございました!今後はArrayListはやめて起きます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

規格は追い切れてないんだけど, 見た感じ (ProductA) によるキャストが ObjList にしかかかっていないんじゃない?

coelacanth9
質問者

お礼

ご回答ありがとうございます。 僕の書いた内容が間違っていたのですが、Tacosanさんのおっしゃっている事もあたらずも遠からずという感じでした。今回はもう一方の回答者様の方で理解できましたので、そちらをベストアンサーにさせて頂きます。