質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

499閲覧

見たことのないエラーが出る&ゲッタの使い方

rink

総合スコア80

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/05/28 15:33

java

1import java.util.ArrayList; 2import java.util.HashMap; 3 4class Teacher{ 5 6 String name; 7 String subject; 8 String s; 9 10 public Teacher(String name, String subject){ 11 12 this.name = name; 13 this.subject = subject; 14 System.out.println("name:" + name + "subject:" + subject); 15 16 } 17 18 public String getName(){ 19 20 return this.name; 21 22 } 23 24 public String getSubject(){ 25 26 return this.subject; 27 28 } 29 30 public void setData(String name, String subject){ 31 32 this.name = name; 33 this.subject = subject; 34 35 } 36 37} 38 39class Student{ 40 41 int number; 42 String name; 43 int grade; 44 45 public Student(int number, String name, int grade){ 46 47 this.number = number; 48 this.name = name; 49 this.grade = grade; 50 51 } 52 53 public int getNumber(){ 54 55 return number; 56 57 } 58 59 public String getName(){ 60 61 return name; 62 63 } 64 65 public int getGrade(){ 66 67 return grade; 68 69 } 70 71} 72 73class simon9{ 74 75 public static void main(String[] args){ 76 77 ArrayList teacher = new ArrayList(); 78 HashMap<Integer, Student> student = new HashMap<>(); 79 80 Teacher teacher1 = new Teacher("rink","jap"); 81 Teacher teacher2 = new Teacher("rink1","mat"); 82 Teacher teacher3 = new Teacher("rink2","sci"); 83 Teacher teacher4 = new Teacher("rink3","eng"); 84 85 Student student1 = new Student(11,"rink1",2); 86 Student student2 = new Student(12,"rink2",2); 87 Student student3 = new Student(13,"rink3",2); 88 Student student4 = new Student(14,"rink4",2); 89 90 91 teacher.add(teacher1); 92 teacher.add(teacher2); 93 teacher.add(teacher3); 94 teacher.add(teacher4); 95 96 for(int i = 0; i < 4; i++){ 97 98 String ss = (String)teacher.get(i).getName() + " " + 99 (String)teacher.get(i).getSubject(); 100 101 System.out.print(ss); 102 103 } 104 105 student.put(11,student1); 106 student.put(12,student2); 107 student.put(13,student3); 108 student.put(14,student4); 109 110 } 111 112} 113

自分で簡単に書いてみたんですが、以下のエラーが出てしまいます。

java

1simon9.java:98: エラー: シンボルを見つけられません 2 String ss = (String)teacher.get(i).getName() + " " + 3 ^ 4 シンボル: メソッド getName() 5 場所: クラス Object 6simon9.java:99: エラー: シンボルを見つけられません 7 (String)teacher.get(i).getSubject(); 8 ^ 9 シンボル: メソッド getSubject() 10 場所: クラス Object 11注意:simon9.javaの操作は、未チェックまたは安全ではありません。 12注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。 13エラー214

ゲッタの使い方が違っているのか、それとも根本的な問題なのか、未熟な自分にはわかりません。また、javaの操作は未チェックですと出てしまいます。

どのようにすればよいかわかる方、どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

原因

ArrayList teacher = new ArrayList();

としか書かないとteacherの要素の型についてJavaは「少なくともObjectなんだろうけどそれ以上わからないや」としか思ってくれません。後でaddしてるのがTeacher型しかないから「多分Teacherなんだろう」なんて察してはくれません。
このため、Javaは

teacher.get(i).getName()

を見たとき、

(1) teacher.get(i)の結果はObject型
(2) Object型にはgetNameなんてメソッドない

と判断しご質問のようなコンパイルエラーを出すわけです。

対処

teacherの要素の型がTeacherであることを明示してください。具体的には次のように書きます。

ArrayList<Teacher> teachers = new ArrayList<>();

このあたりは大変重要な仕様なのでJavaのジェネリクスについて仕様を確認することをお勧めします。


本題と関係ないですが、英語で変数名を付けるなら単数なのか複数なのかは区別するとよいです。なぜかというと

java

1for (Teacher teacher : teachers) { 2 ... 3}

のようなコードにおいてコンテナとその要素を同じ単語の単数と複数で書き分けるのに便利だからです。

投稿2019/05/28 16:06

編集2019/05/28 16:10
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rink

2019/05/28 16:09

ご回答ありがとうございます! ジェネリクスの問題だとは知りませんでした。これを機に勉強させていただきます!ありがとうございました”!!
rink

2019/05/28 16:11

ごめんなさい、できませんでした…
KSwordOfHaste

2019/05/28 16:11

回答のコードで、初期化の右辺が抜けてたので追記しておきました。
rink

2019/05/28 16:13

出来ました( ;∀;) 本当にありがとうございます!
guest

0

java

1ArrayList teacher = new ArrayList();

これをジェネリクスを使わず「未加工型」で宣言しているため、

java

1teacher.get(i)

で返ってくる値はTeacher型ではなくObject型になります。
ObjectクラスにgetNameやgetSubjectというメソッドは存在しないため、エラーとなります。
teacherの宣言時にジェネリクスを使って

java

1ArrayList<Teacher> teacher = new ArrayList<>();

としましょう。

投稿2019/05/28 16:10

編集2019/05/28 16:20
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rink

2019/05/28 16:13

ご回答ありがとうございます!とても分かりやすく説明してくださり助かりました! ありがとうございました!
KSwordOfHaste

2019/05/28 16:16

swordoneさん、右辺のダイアモンドを入れ忘れておられます
swordone

2019/05/28 16:20

おうふ、ご指摘ありがとうございます。
guest

0


ちゃうやん。
String ss = teacher[i].getName() + " " +
teacher[i].getSubject();
getってないやんw

投稿2019/05/28 15:40

編集2019/05/28 15:46
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rink

2019/05/28 15:43

できませんでした…
y_waiwai

2019/05/28 15:44

すんません、回答修正しました
rink

2019/05/28 15:45

そうすると格納した4人分全員の情報とりだせなくないですか?
rink

2019/05/28 16:03

可変長配列なので[i]ってできなくないですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問