• ベストアンサー

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

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

  • ベストアンサー
  • farseer
  • ベストアンサー率100% (3/3)
回答No.3

他の方の解説はいずれも正しいのですが、理解のために改めて誤解されている点を明確にすると、つまり、こうしたチェックは、オブジェクトの実体の型ではなく、それを格納した変数の型に基づいて行われるということです。 capitarizeさんはスクリプト言語などからJavaへ範囲を広げようとしている方でしょうか。コンパイル時の静的な型チェックを行わない言語から入ってくる場合には、よくある誤解だと思います。 このコードは、実行時にエラーが出るのではなく、コンパイル時にエラーになりますよね。たぶん、コンパイラを開発する時に、どういうエラーチェック処理を実装できるだろうか、という見方をすると、わかりやすいと思います。 String ss = list.get(0); という文を見つけた時、コンパイラは、list変数の型は知っています。ですから、その型(この場合はCollection型)のメソッドとして正しいかのチェックは容易です。 一方、list変数にその時点で代入されているオブジェクトの実体がどの型か、ということについては、コンパイルの時点では、判別は容易ではありません(実行時にはもちろん容易ですが)。 今回のコードに限って言えば、人間が見れば、list変数の中身はArrayList型であり、get(int)メソッドを持っているのは明らかです。しかし、一般化して考えた場合、同じ文でも、変数の中身の型はわからないことも多々あります。 例: public void example(Collection<String> list) { String ss = list.get(0); } つまり、コンパイル時のエラーチェックでは、変数の型によって判別するしかないということで、そのためJava言語の仕様として、変数の型に合ったメソッドしか呼び出しできないことに決めているわけです。

その他の回答 (2)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>Collection<String>型なのでメソッドget()は実行できません。と解説にあるのですが、 そのままです。Collection 型のマニュアルを見れば、get() メソッドがないことに気付くでしょう。 今回、変数 list に格納されている実際のオブジェクトは ArrayList ですが、list は Collection 型なので、これに「最初の要素」という概念はありません。 多分、toArray() で配列化してもそれが元々の ArrayList の先頭要素である保証はないと思います。

回答No.1

Collectionにはgetメソッドが存在しないのでエラーになっています。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Collection.html List list = new ArrayList() とすればできるはずです。

関連するQ&A

  • 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::getメソッドは何で不便に作られている?

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

    • ベストアンサー
    • 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
  • mainメソッドと同じオブジェクト内のメソッドにはstaticを必ずつ

    mainメソッドと同じオブジェクト内のメソッドにはstaticを必ずつけなければならないのでしょうか? そのような記述を見掛けたのですが、もしこれが正しいという場合、 それは、なぜなのでしょう? java初心者ですが、どうぞ宜しくお願いいたします。 class MainClass{  //先頭のstaticに注目  static void sub(){   ~~  }  //mainメソッド  public static void main(String[] args){   sub();  } }

    • ベストアンサー
    • 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 と出ています 解決策教えてください 全てのプログラムを書いてるわけではありませんので おそらく関係のあるだろうってところを書きましたので わかりづらかったらすみません

  • このプログラムが実行できません。

    スタックの動きを再現するプログラムを作ったのですが、エラーがでます。プログラムは以下に示します。 メインクラス public class mainStack { public static void main(String[] args) { StackTest stack=new StackTest(); stack.push("AAAAA"); stack.push("BBBBB"); } } スタックのクラス import java.util.ArrayList; @SuppressWarnings("unchecked") public class StackTest implements Stack { ArrayList list=new ArrayList(); public int AA=0; public boolean empty() { if(list.isEmpty()==true){ return true; } else{ return false; } } public void pop() { list.remove(AA); AA--; } public void push(String element) { list.add(element); AA++; } public void top(){ System.out.println(list.get(AA)); } } 何故かlist.add()のところにエラーが出てしまいます。是非分かる方解答お願いします。

    • ベストアンサー
    • Java
  • メインメソッドの記述について

    メインメソッドを記述する際に、   public static void main(String[] args){     ~~~~~~~~~~~~~   } と書くと思いますが、なぜpublicを付けなければならないのでしょうか? 簡単に考えるために、1つのクラスのみで実行してみたのですがやはりpublicをつけないとエラーになってしまします。 1つのクラスしかないので、どこからも参照されないからpublicでなくても良いと思ったのですが・・・ ちなみに以下の様なとても簡単なもので考えました。 class E_1{ static void main(String[] args){ System.out.println("実験です"); } }

  • 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などのソート

     いつもお世話になっています。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
  • ArrayListによる計算表作成

    for文を使用し九九の計算結果を配列に格納し、その配列内の情報を表形式で表示してみる。※配列はArrayListを使用すること 上記の問題を解いています。 -------------------------------------------------------------- import java.util.ArrayList; public class m4_2 { public static void main(String args[]) { ArrayList list = new ArrayList(); String[]s = new String[9]; for(int i = 1; i<=s.length; i++){ for(int j =1; j<=s.length; j++){ list.add((i * j));     //ここがどのように記述するか?? } System.out.print(list.get(0)); System.out.print(list.get(1)); System.out.print(list.get(2)); System.out.print(list.get(3)); System.out.print(list.get(4)); System.out.print(list.get(5)); System.out.print(list.get(6)); System.out.print(list.get(7)); System.out.print(list.get(8)); System.out.print("\n"); } } } ---------------------------------------------------------- 実行結果イメージ 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 (以下省略) 私の書いたソースでは1の位しか計算してくれません。 今月から本格的にJavaを勉強し始めた初心者なので どうかよろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう