アプリ版:「スタンプのみでお礼する」機能のリリースについて

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メソッドというわけでもなさそうだし。

A 回答 (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言語の仕様として、変数の型に合ったメソッドしか呼び出しできないことに決めているわけです。
    • good
    • 0

>Collection<String>型なのでメソッドget()は実行できません。

と解説にあるのですが、

そのままです。Collection 型のマニュアルを見れば、get() メソッドがないことに気付くでしょう。

今回、変数 list に格納されている実際のオブジェクトは ArrayList ですが、list は Collection 型なので、これに「最初の要素」という概念はありません。

多分、toArray() で配列化してもそれが元々の ArrayList の先頭要素である保証はないと思います。
    • good
    • 0

Collectionにはgetメソッドが存在しないのでエラーになっています。



http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …

List list = new ArrayList()

とすればできるはずです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!