
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メソッドというわけでもなさそうだし。
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言語の仕様として、変数の型に合ったメソッドしか呼び出しできないことに決めているわけです。
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/ja …
List list = new ArrayList()
とすればできるはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- Java eclipse実行ができない 2 2022/07/27 04:47
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
0歳児の指しゃぶりに関して
-
Labelコントロールに数字を代入...
-
javascriptからjavaを呼び出したい
-
【sendkeysメソッドが動かずに...
-
配列のメソッド
-
mainメソッドのthrows節で設定...
-
CALLされていないメソッドを見...
-
JAVA言語,JSPによるクイズシス...
-
処理内容がほぼ同じメソッドの...
-
final修飾子を使っているのに、...
-
VBPをダブルクリックするとたま...
-
JSPで<SELECT>の中にDBから持っ...
-
コマンドプロンプト実行後に画...
-
Excel VBA でExcelを終了したい...
-
[VBA]GetSaveAsFilenameメソッ...
-
引数は省略できません。とのコ...
-
eclipse-Tomcatでのデバッグに...
-
VBAでSaveAs使用し、指定してい...
-
エクセルVBAにおけるON TIMEメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
【sendkeysメソッドが動かずに...
-
コマンドプロンプト実行後に画...
-
VBA コピーが出来ません…!
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
eclipse-Tomcatでのデバッグに...
-
Application.Wait の参照設定
-
エクセルVBAにおけるON TIMEメ...
-
配列のメソッド
-
エクセルのマクロでプリンタを...
-
final修飾子を使っているのに、...
-
drawStringで文字間隔の調整
-
Excel VBA でExcelを終了したい...
-
worksheets & rows メソッドは...
-
CALLされていないメソッドを見...
-
vbaエクセルマクロ RemoveDupli...
おすすめ情報