• ベストアンサー

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
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

何でも入れられるようにするために、Object型を保持するようになっているため。(J2SE1.4) JavaTM 2 Platform Standard Edition 5.0 からは、 格納するオブジェクトの型を指定してArrayListが作成できるようになっている。 ArrayList<Integer> list = new ArrayList<Integer>(); のようにする。

white-tiger
質問者

お礼

なるほど、事情が分かりました。 やはり5.0では修正されたのですね。 みなさまありがとうございます!

その他の回答 (2)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

ArrayListに限らずコレクション系のクラス・インターフェースは汎用性を持たせるためにObjectクラスを扱っています。 狭い目で見れば不便ですが広い目で見れば便利です。 また、Java 5.0からはGenerics対応になりキャストを不要にすることも可能になりました。

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/language/generics.html
noname#20377
noname#20377
回答No.1

Javaの経験はないけど・・・噂でGenericsとか言うのを聞いたことがある。参考になれば。 http://www.javaworld.jp/technology_and_programming/-/18161.html

関連するQ&A

  • 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のイテレータについて

    java初心者です. 以下のようなプログラム(かなり簡略化しています)で ArrayList<Integer> list =new ArrayList<Integer>(); list.add(new Integer(1)); Iterator it = list.iterator(); while(it.hasNext()){ it.next() if(Math.random()<0.5) list.add(new Integer(2));//50%の確率で"2"を追加 }; arraylistの「先頭からイテレータを使って呼び出していくのと同時に,後ろに50%の確率で"2"を追加していきたい」のですが, うまく動作しません.「」の中のような動作を行うには,どうすればいいでしょうか? よろしくお願いします.

  • ArrayList で配列を扱う場合の記述方法について

    ArrayList で配列を扱う場合の記述方法について、 探しきれないのでご教授お願いします。 ArrayList list = new ArrayList(); list.add("AAA"); list.add("BBB"); list.add("CCC"); for (int i = 0; i < list.size(); i++) { System.out.println(i+"は"+list.get(i)); } という箇所をArrayList<Date>listを使って書き直すのはどのようになるでしょうか。 ArrayList<Date>list= new ArrayList<Date>(); list.add("AAA"); list.add("BBB"); list.add("CCC"); for (int i = 0; i < list.size(); i++) { System.out.println(i+"は"+list.get(i)); } とすると、 型 ArrayList<Date> のメソッド add(Date) は引数 (String) に適用できません。 というエラーになってしまいました。

    • ベストアンサー
    • Java
  • jspでのArrayListの値の表示

    jsp上でBeanで以下のように設定されている ArrayList<ArrayList<Integer>> a; a.add(new ArrayList<Integer>); a.add(new ArrayList<Integer>); a.add(new ArrayList<Integer>); a.get(0).add(0); a.get(0).add(1); a.get(1).add(2); a.get(1).add(3); a.get(1).add(4); a.get(1).add(5); a.get(2).add(6); a.get(2).add(7); a.get(2).add(8); aのような行と列が不定のArrayListの全ての値をjspの画面上に  値 値 値  0  2  6  1  3  7    4  8    5 といったようにテーブルで表示したいのですがjspにどのような既述をすればよいでしょうか? クリックしたときの処理などの導入や項目を増やすなど拡張する場合があるので 以下のような形とレイアウトが同じようになると望ましいです <td> <table> <tr>値</tr> <tr>0</tr> <tr>1</tr> <tr>2</tr> </table> </td> <td> <table> <tr>値</tr> <tr>3</tr> <tr>4</tr> <tr>5</tr> </table> </td> <td> <table> <tr>値</tr> <tr>6</tr> <tr>7</tr> <tr>8</tr> </table> </td>

  • (ソースコード有)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
  • ArrayList の継承について(初心者です)

    買い物かごクラスのプログラムを作っています。 このソースはフィールドにListを持たせているのですが、ArrayList を継承 してCartクラスを作りたいです。そうすることで、CartクラスのaddItem() メソッドやremoveItem()メソッドはmainでメソッドを呼び出せば良いため、 不要になると思うのですが、合計金額を求めるときに、どのように商品値段 を参照していいのかわかりません。 また、ArrayList を継承する場合、public class Cart extends ArrayList という書き方で良いのでしょうか? public class Cart { List<Item> itemList = new ArrayList<Item>(); public ShoppingCart(){} //商品をカートに追加 public void addItem(Item item){ itemList.add(item); } //カート内に入っている商品の合計金額を返却 public int getTotalPrice(){ int total=0; for(int i=0;i<getItemSize();i++){ total+=itemList.get(i).getPrice(); } return total; } //リストの指定された位置にある要素を削除 public void removeItem(int index){ itemList.remove(index); } }

  • ArrayListにArrayListを用いた場合の対応について

    public static ArrayList<Integer> f1 = new ArrayList<Integer>(); public static ArrayList<ArrayList> f2 = new ArrayList<ArrayList>(); public void parse(Context ct){   if(ct.match("f")){ ct.nextToken(); while(ct.currentToken() != null && ct.currentToken().matches("[0-9]+/[0-9]*/[0-9]+")){ f1.add(ct.fToken(ct.currentToken())); ct.nextToken(); } f2.add(f1); f1.clear(); System.out.println(f2); 例f⇒f 1/4/3 2/5/6 4/5/6  1行⇒[1,2,4]  1/3/5 7/1/2 8/3/4  2行⇒[1,7,8]         ・         ・         ・   回答例⇒[[1,2,4],[1,7,8],[…],…,[…]] 上記のようなobj形式のf行をそれぞれ1行ごとに頭文字を取り出して(Contextで)、f1=ArrayList<Integer>にaddしていき、1行を読み終わったらf1=ArrayList<Integer>をf2=ArrayList<ArrayList>にaddしていき、最終的には回答例のような形にしたいです。 私はf1にaddした数字をf2にf1をaddして、その後f1をclearしてその空いたf1にまた次の行の数字をaddさせるつもりだったのですが、f1をクリアしてしまうと一度f2にaddしたはずのものも消えてしまうことに気づきました。 どのように改造すれば回答例のようにf2のArrayListにf1のArrayListをいくつもいれて表示することができますか。 教えてください。

  • 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はオブジェクトのポインタを渡している?

    ArrayListはオブジェクトのポインタを渡している? 例えば、一つのメソッド内に以下のように書くと、出力は最下部のようになります。 listに入れたモデルを取り出さずにModelを変更しても、listに入れたモデルを変更したのと同じことが出来ています。 C言語で言うところの(Cはあまり覚えていませんが…)、ポインタを渡しているようなイメージになるのでしょうか? --コード-- Model model1 = new Model("model1"); Model model2 = new Model("model2"); ArrayList list = new ArrayList<Model>(); list.add(model1); list.add(model2); showList(list); model1.setName("model1_"); showList(list); --出力-- model1 model2 model1_ model2

    • ベストアンサー
    • Java
  • ArrayListなどのソート

     いつもお世話になっています。ArrayListなどをソートする際に、Comparatorインターフェースを実装したクラスを利用して、辞書順や数値順などでソートすることは出来ますよね。これを任意の単語の順番にソートするにはどのようにすればよいのでしょうか。つまり、下記例において、文字列順ではなくて、"ONE", "TWO", "THREE", "FOUR"の順番にソートしたいのです。 ArrayList list = new ArrayList(); list.add("THREE"); list.add("ONE"); list.add("FOR"); list.add("TWO");  やはりcompare()メソッド内で総当り的に比較するしかないのでしょうか。  開発環境はJDK1.4です。事情により返答が遅れてしまうかもしれませんが、どうぞ宜しくお願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう