ArrayListについて

このQ&Aのポイント
  • ArrayListとは、Javaのデータ構造の一つで、可変長の配列を扱うことができるクラスです。
  • ArrayListは要素の追加や削除が簡単に行えるため、便利なデータ構造としてよく使われます。
  • しかし、ArrayListには制約がなく、異なる型の要素を格納することができるため、データの型の一貫性が保証されず、予期せぬエラーが発生する可能性があります。
回答を見る
  • ベストアンサー

(ソースコード有)ArrayListについて

(ソースコード有)ArrayListに何でも入れられるのが問題と本に書いてあったのですがどういうことですか? package jp.rutles.sample; import java.util.ArrayList; public class MyJavaApp { static ArrayList data; public static void main(String[] args) { data = new ArrayList(); data.add(new MyObject("Hello")); data.add(new MyObject("Welcome")); data.add(new MyObject("Bye!")); addString("etc"); for(Object obj : data){ MyObject myobj = (MyObject)obj; System.out.println(myobj); } } public static void addString(String s){ data.add(s); } } 本ではこれを実行すると、 プログラム自体は問題がなくコンパイルして実行できるのですが、途中でエラーが発生して強制終了します。 その原因がaddStringというメソッドがdataフィールドにStringオブジェクトを保管するものだからだそうです。 mainメソッドではMyObjectを追加して中身をそのままforで出力しているだけですが、取り出したオブジェクトをMyObjectにキャストするところで、エラーになってしまうらしいです。(なんかこの文の文法が少し変な気はしますが本もこのようにかいていますw) addStringを呼び出すと、ArrayListにStringが追加されます。このStringを取り出してMyObjectにキャストしようとしたためにエラーになってしまった。らしいです。 まず 「mainメソッドではMyObjectを追加して中身をそのままforで出力しているだけですが、 取り出したオブジェクトをMyObjectにキャストするところで、エラーになってしまう。」 というのがよくわかりません。 そして 「addStringを呼び出すと、ArrayListにStringが追加されます。このStringを取り出してMyObjectにキャストしようとしたためにエラーになってしまった。」 これもよくわかりません。 ArrayListになんでも入れれることがなぜ問題なのかを知りたいので この本ではこのあとこれを上手に解決する方法として ジェネリックスというものを解説してくれているのですが これは使わないようにお願いします! すごく注文が多いのですが どなたか教えてくださいお願いします!

  • Java
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
回答No.1

順を追って説明しましょう。 > static ArrayList data; ArrayListを宣言していますが、そのArrayListの中には、 どういうデータ型のものを格納するのかを明記していません。 その為、『どのような型でも入れることが出来る状態』にあります。 > data.add(new MyObject("Hello")); MyObjectというデータ型をdataに格納しようとしています。 > data.add(s); sはString型なので、String型をdataに格納しようとしています。 この時点で、data変数には、MyObjectとStringという2つの型が 格納されている状態にあります。 このときに > MyObject myobj = (MyObject)obj; とMyObject型であることを前提として処理されても、String型の データはMyObject型でありませんから、型変換に失敗してしまいます。 これは、今回のように、本来MyObject型として処理しようとして いるロジックを書こうとしていたのに、実はString型が混じっていて エラーになってしまうバグを生み出しやすいという問題があります。 これは型指定を厳密に指定する言語としては致命的です。 それを解決するものとしてジェネリクスがあります。

関連するQ&A

  • ArrayListを改良したい

    visual C# 2010 Express を使用しています。 ArrayListは動的に要素を追加できるの便利なのですが、 次のような使い方で要素を取り出そうとするとasキャストが必要になってしまいます・・・ class Data : Dictionary<string, string> { } class DataList : ArrayList { public void Add(Data value) { base.Add(value as Data); } } class Program { static void Main(string[] args) { var d = new Data(); d["a"] = "aa"; d["b"] = "bb"; DataList arr = new DataList(); arr.Add(d); // var dd = arr[0] as Data; var dd = arr[0]; Console.WriteLine(dd["a"]);// エラー 角かっこ [] 付きインデックスを 'object' 型の式に適用することはできません。 Console.ReadLine(); } } そこでというか、ラップした独自のクラスを作りたいと思い上のような感じで作成したのですが、 やはり同じエラーになってしまいます・・・ asキャストを必要とせず、そのままDataクラス(Dictionary<string, string>)を 取り出すためにはどのように作成したら良いのでしょうか?

  • ArrayListのgetメソッドが実行できない!

    public class ALTest{ public static void main(String[] args){ Collection<String> list = new ArrayList<String>(); list.add(One);list.add(Two);list.add(Three); //ここに記述 } } 上記「ここに記述」の箇所に以下を書いた場合の話です。  String ss = list.get(0); Collection<String>型なのでメソッドget()は実行できません。と解説にあるのですが、 理由がわかりません。Get()がstaticメソッドというわけでもなさそうだし。

    • ベストアンサー
    • Java
  • ArrayListのcloneメソッド

    お世話になります。 ArrayListのcloneメソッドなんですが、API上は「ArrayList のインスタンスのシャローコピーを返します。要素自体はコピーされません。 」と記載がありますが、 「ディープコピー」をしているような感じがして、なぜ「シャローコピー」と言っているのか、教えて欲しいです。 しかも、要素自体もコピーされているような…。 自分の理解では、 シャローコピー:コピー元、コピー先で同じオブジェクトを参照する ディープコピー:コピー元、コピー先で違うオブジェクトを参照する 試したソースは以下です。 --------------- import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); array.add("a"); array.add("b"); ArrayList<String> array2 = (ArrayList<String>) array.clone(); array2.add("c"); System.out.println("array:" + array); System.out.println("array2:" + array2); } } --------------- cloneメソッドはシャローコピーなので、array2で「c」がaddされたら、arrayも「c」が追加されて、 array:[a, b, c] array2:[a, b, c] となるはずが、 array:[a, b] array2:[a, b, c] となります。 array、array2は別々のオブジェクトを参照しているような気がします。 恐らく大きな勘違いをしているのかもしれませんが、 調べてもいまいち理解できませんでした。 お手数おかけしますが、よろしくお願い致します。

    • ベストアンサー
    • Java
  • arraylistの呼び出し

    A.classでB.classのarraylistを作成し Cクラスのオブジェクトを何個もarraylistに保存しているんですけど そのarraylistをbクラスで使いたいんですけど うまくいきません 例とエラー文を載せますので、教えてください 例 public class A{ int i=0; int b=0; public static void main(String[] args){ ArrayList<B> strs=new ArrayList<B>(0); for(b=0;b<30;b++){ B b =new B(); //ここは何回も作ってます strs.add(b,i);   i++; } } public ArrayList get(){ return strs; } } class C { A a; static count=0; public void syutoku(SimpleTrajectoryViewer si){ this.a=a; } public void c(){ B b=new B(); ArrayList b =a.get(); B p=b.get(count); count ++; } } エラー文はクラスの ArrayList b =a.get();の部分で 互換性のない型 期待値  B 検出値     object と出ています 解決策教えてください 全てのプログラムを書いてるわけではありませんので おそらく関係のあるだろうってところを書きましたので わかりづらかったらすみません

  • ArrayListクラスを利用するプログラムについて質問があるのですが。

    「Genericsを用いたArrayListを使用しループ処理にはiteratorを使用する。 という指定の下、 ArrayListのインスタンスを生成し次の5つの文字列を追加した後、 for文を使ってリストの中身を全て順番に画面表示したいんです。 "AA" "BB" "CC" "DD" "EE" --------------------------- import java.util.ArrayList; class TestA{ public static void main(String args[]) { ArrayList<String> array = new ArrayList<String>(); array.add("AA"); array.add("BB"); array.add("CC"); array.add("DD"); array.add("EE"); } } --------------------------- ここからよく解らないので教えていただけませんでしょうか?

    • ベストアンサー
    • Java
  • ArrayList::getメソッドは何で不便に作られている?

    ArrayList::getメソッドはObject型を返却しますよね。 そのため、たとえば、  ArrayList list = new ArrayList();  Integer aaa = new Integer();  list.add(aaa);  Integer aaa2 = (Integer)list.get(0); のように、Integerでリストに追加したものを取り出すのに わざわざIntegerでキャストしなければなりません。 なんで、こんな不便な仕様になっているのでしょうか?

    • ベストアンサー
    • Java
  • 以下のコードのどこが問題なのでしょうか?

    java初心者です。よろしくお願いいたします。以下のコードはどこに問題があるのでしょうか?よろしくお願いいたします。 public class Sample2 { public static void main(String[] args1,String[] args2) { MyObject object = new MyObject(); object.setName("mikel" , "jun"); String s = object.getName(); System.out.println(s); } } class MyObject { String name; public void setName(String str1,String str2) { name = "str1"+"str2"; } public String getName() { return name; } }

    • ベストアンサー
    • Java
  • sleepメソッドを呼び出すには?

    JAVAのプログラムを勉強しているのですが、ArrayList<Character>の各要素に対してsleepメソッドを呼び出したいのですが、c.sleep ();と打つとエラーになってしまいます。 package pkg6.pkg5.pkg1; import java.util.ArrayList; import java.lang.*; public class Main { public static void main (String[] args) { ArrayList<Character>list2 = new ArrayList<Character>(); list2.add ('A'); list2.add ('b'); for (Character c:list2) { c.sleep (); //↑この部分がエラーになる } } } なぜこうなるのでしょうか?sleepメソッドは呼び出せないのでしょうか? ご教授願います

    • ベストアンサー
    • Java
  • ArrayList でスタックを

    初歩的でツマラナイかもしれません。 import java.util.ArrayList; でスタックを実現するクラス"MyStack"を書きました。 フィールドは private ArrayList<Integer> stack = new ArrayList<Integer>(); のみという条件です。 MyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MyStack {   private ArrayList<Integer> stack = new ArrayList<Integer>();      // データを先頭に追加   public void push( int item ) {     stack.add( item );   }   // 先頭のデータを取り出す   public int pop( ) {     int rtn;     if( stack.isEmpty() ) {       System.out.println( "スタックは空です." );       System.exit( 1 );     }          rtn = stack.get( 0 );     stack.remove( 0 );     return rtn;   } } このMyStackを実行するクラス"MainForMyStack"を書きます。 実行結果は、標準出力に 43210 と出ることを想定しています。 MainForMyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MainForMyStack {   public static void main(String[] args) {     MyStack stack = new MyStack();     // 0,1,2,3,4 をスタックに追加     for( int i=0; i < 5; i++ ) {       stack.push( i );     }     // スタックのデータを先頭から取り出す     for( int i=0; i < stack.size(); i++ ) {       System.out.print( stack.pop() );     }   } } さて、MainForMyStack.java の i < stack.size(); の箇所でエラーが出るのはなぜでしょう? どなたかご教授の方お願いします。

    • ベストアンサー
    • Java
  • 「型 ArrayList は総称ではありません・・・。」エラーについての問題です。

    コンニチハ、javaの初心者s-unです。 Eclipse(Ver:3.1.1)でJavaのプログラムを書いています。 *********************************** import java.util.ArrayList; class collectionTest1{ public static void main(String args[]){ ArrayList<String> array = new ArrayList<String>(); } } *********************************** エラーメッセージは 「型 ArrayList は総称ではありません。引数 <String> でパラメーター化できません。」 JDK準拠>>コンパイラー準拠レベル5.0になっています。 原因をお教え頂けますと幸いです。 よろしくお願い申し上げます。

    • ベストアンサー
    • Java

専門家に質問してみよう