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

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

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

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

4469閲覧

超初心者用4択クイズに拡張性を持たせたい。

294

総合スコア1

Java

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/28 05:25

お世話になります。
9月から少しずつjavaを勉強し始めた初心者です。
質問の仕方、現状の把握など見当違いの事も多いかと思いますが、御助言頂ければ幸いです。

現在、超初心者向けの4択クイズを作っています。
クイズを進行するメインのクラスと問題クラスを作り、問題クラスを呼び出すことでクイズが進む様なコードを書いています。
メインクラスをシンプルにするために各問題クラスを配列用いて管理出来ればと思ったのですが、
エラー: 不適合な型: Q1をQuizに変換できません:
question[0] = q1;
と出てしまい上手くいきません。

そもそもクラスを配列入れ呼び出すという発想が間違っているのでしょうか?
御助言頂けますと幸いです。

発生している問題・エラーメッセージ

エラーメッセージ

Quiz.java:23: エラー: 不適合な型: Q1をQuizに変換できません:
question[0] = q1;
^
Quiz.java:24: エラー: 不適合な型: Q2をQuizに変換できません:
question[1] = q2;
^
Quiz.java:25: エラー: 不適合な型: Q3をQuizに変換できません:
question[2] = q3;
^
Quiz.java:26: エラー: 不適合な型: Q4をQuizに変換できません:
question[3] = q4;
^
Quiz.java:27: エラー: 不適合な型: Q5をQuizに変換できません:
question[4] = q5;
^
エラー5個

該当のソースコード

java

1【メインクラス】 2import java.io.BufferedReader; 3import java.io.InputStreamReader; 4import java.util.Random; 5 6public class Quiz 7{ 8 public static void main(String[] args) 9 //クイズ進行用メインメソッド 10 { 11 12 Q1 q1 = new Q1(); 13 Q2 q2 = new Q2(); 14 Q3 q3 = new Q3(); 15 Q4 q4 = new Q4(); 16 Q5 q5 = new Q5(); 17 18 Quiz[] question; 19 question = new Quiz[5]; 20 21 question[0] = q1; 22 question[1] = q2; 23 question[2] = q3; 24 question[3] = q4; 25 question[4] = q5; 26 27 for(i = 0; i <= question.length; i++){ 28 question[i].inform(); 29 30 } 31 } 32} 33 34【問題クラス1/その他の問題クラスも出題内容を変えただけで同じものになります。】 35import java.io.BufferedReader; 36import java.io.InputStreamReader; 37import java.util.Random; 38 39public class Q1 40{ 41 //1問目 42 public void inform() 43 { 44 while(true){ 45 System.out.println("\n 第1問!!"); 46 System.out.println(" アメリカの首都はどこですか?"); 47 System.out.println(" 1:ニューヨーク"); 48 System.out.println(" 2:ワシントン"); 49 System.out.println(" 3:ロサンジェルス"); 50 System.out.println(" 答えを番号で入力し、エンターキーを押してください。→"); 51 52 InputStreamReader inputStreamReader = new InputStreamReader(System.in); 53 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 54 55 int answer = 0; 56 String message = " ハズレ(´・ω・`)もう一度考えてみてね!"; 57 58 try 59 { 60 String buf = bufferedReader.readLine(); 61 answer = Integer.parseInt(buf); 62 } 63 catch (Exception exception) 64 { 65 answer = 0; 66 message = " 答えを番号で入力し下さい(´;ω;`)"; 67 } 68 if(answer == 2) 69 { 70 message = " 正解(`・ω・´)b良く出来ました!"; 71 System.out.println(message); 72 break; 73 } 74 System.out.println(message); 75 } 76 } 77}

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

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

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

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

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

guest

回答3

0

Q1~Q5 に共通のスーパークラス Q を作って、それの配列に入れましょう。
Q1~Q5 には異なる部分だけを実装しましょう。
System.in は 1個なので、BufferdReader も 1個にしましょう。

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.util.Random; 4 5class Quiz { 6 public static void main(String[] args) { 7 InputStreamReader inputStreamReader = new InputStreamReader(System.in); 8 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 9 10 Q[] question = new Q[5]; 11 12 question[0] = new Q1(bufferedReader); 13 question[1] = new Q2(bufferedReader); 14 question[2] = new Q1(bufferedReader); 15 question[3] = new Q2(bufferedReader); 16 question[4] = new Q1(bufferedReader); 17 18 for(int i = 0; i < question.length; i++){ // ★ <= を < に修正 19 question[i].inform(); 20 } 21 } 22} 23 24class Q { 25 BufferedReader bufferedReader; 26 27 Q(BufferedReader br) { bufferedReader = br; } 28 29 public void inform() { 30 while (true) { 31 question(); 32 int answer = 0; 33 String message = " ハズレ(´・ω・`)もう一度考えてみてね!"; 34 35 try { 36 String buf = bufferedReader.readLine(); 37 answer = Integer.parseInt(buf); 38 } 39 catch (Exception exception) { 40 answer = 0; 41 message = " 答えを番号で入力し下さい(´;ω;`)"; 42 } 43 if (check(answer)) { 44 message = " 正解(`・ω・´)b良く出来ました!"; 45 System.out.println(message); 46 break; 47 } 48 System.out.println(message); 49 } 50 } 51 52 public void question() { } 53 public boolean check(int answer) { return false; } 54} 55 56class Q1 extends Q { 57 Q1(BufferedReader br) { super(br); } 58 59 public void question() { 60 System.out.println("\n 第1問!!"); 61 System.out.println(" アメリカの首都はどこですか?"); 62 System.out.println(" 1:ニューヨーク"); 63 System.out.println(" 2:ワシントン D.C."); 64 System.out.println(" 3:ロサンジェルス"); 65 System.out.println(" 答えを番号で入力し、エンターキーを押してください。→"); 66 } 67 68 public boolean check(int answer) { 69 return answer == 2; 70 } 71} 72 73class Q2 extends Q { 74 Q2(BufferedReader br) { super(br); } 75 76 public void question() { 77 System.out.println("\n 第2問!!"); 78 System.out.println(" フランスの首都はどこですか?"); 79 System.out.println(" 1:パリ"); 80 System.out.println(" 2:ニース"); 81 System.out.println(" 3:カンヌ"); 82 System.out.println(" 答えを番号で入力し、エンターキーを押してください。→"); 83 } 84 85 public boolean check(int answer) { 86 return answer == 1; 87 } 88}

投稿2020/10/28 07:14

kazuma-s

総合スコア8224

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

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

294

2020/10/28 08:33

ありがとうございます! 1つ1つ確認しものに出来るまで繰り返し勉強します! 精進致します!
guest

0

Q1はQuizと関係がないので変換することはできません。
関係をもたせるには、
継承などをする必要があります。
継承については調べてみてください。

public class Quiz{ ... } class Q1 extends Quiz{ ... }

のようにします。
これで、
エラー: 不適合な型: Q1をQuizに変換できません:
というエラーは解決します。

投稿2020/10/28 07:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

294

2020/10/28 23:50

>func_hogehogeさん 御助言ありがとうございます! まだまだ継承やパッケージ等理解出来ていない部分が多々あると痛感しました! 御助言をもとに今後も精進致します!
guest

0

ベストアンサー

Java

1Quiz[] question;

Quiz型の要素を持つ配列であってQ1型やQ2型の要素を持つ配列ではないためです。
Quiz型のオブジェクトしか格納できません。

Java

1Q1 q1 = new Q1(); 2Q2 q2 = new Q2(); 3//↑ではなく 3~5も同様 4 5Quiz q1 = new Quiz(); 6Quiz q2 = new Quiz(); 7//↑こっち

にすることでQuiz型の配列に格納することは可能になります。

投稿2020/10/28 06:53

k_n_h_r

総合スコア58

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

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

294

2020/10/28 07:08

御助言ありがとうございます!! まだまだ自分の理解が浅いことを痛感しました。 精進します!
dodox86

2020/10/28 07:18

>質問者さん あれ? 「そもそもクラスを配列入れ呼び出すという発想が間違っているのでしょうか?」と言う問いかけと、拡張性を考えることについての質問はこの際よかったのでしょうか。 コンパイルエラーへの対応はこちらの回答で済むと思うのですが、回答者のinoue-t さんも 「Quiz型の配列に格納すること"は"可能になります。」と、質問者さんの本当にやりたいこととは違うけど、直近のコンパイルエラーに対する対応はこうなります。と暗に示唆されている気がします。(私の勘ぐり過ぎかもしれませんが)
k_n_h_r

2020/10/28 07:35

>dodox86さん 私も直近のコンパイルエラーに対する対応としてお答えしました。 回答の文中にはありませんが、配列で呼び出す発想が誤っているわけではないという意図の回答でした。 その後どのように実現したいものへ近づけていくかは一旦自らの力で頑張ってほしいなと・・・
dodox86

2020/10/28 07:42

@inoue-t さん > 私も直近のコンパイルエラーに対する対応としてお答えしました。 > 回答の文中にはありませんが、配列で呼び出す発想が誤っているわけではないという意図の回答でした。 はい。ご回答の文面からそのようなご意向であろうと思っていました。 > その後どのように実現したいものへ近づけていくかは一旦自らの力で頑張ってほしいなと・・・ そうですね。私も途中まで回答を書いていたのですが、早々に質問がクローズしたので、投稿を止めました。
294

2020/10/28 23:46

>dodox86さん ご連絡遅くなり申し訳ありません。 私の質問が説明不足でご迷惑をおかけしてしまいました。 最初はメインのクラスに問題まで書いていた為、今後問題数を増やしたり、ランダムに問題を出力したりしたいと考え、その1歩目として問題を別のクラスに分けて管理したいというものでした。そのなかで上記エラーが出たため皆様に御助言を頂いたのですが、テラテイルを今回初めて使って、すぐに助けていただけた事から嬉しくなってテンションが上がりすぎ自分の質問すら頭から飛んで行っていました。 まだ勉強を始めたばかりで何をどうしたら?の状態ではありますが、今回頂けた助言をよく落とし込んで少しずつ自力で完成まで頑張ってみたいと思います! お忙しい中目をかけてくださりありがとうございます!!
294

2020/10/28 23:48

>dodox86さん 思い切り舞い上がってしまい意図を汲み取れず申し訳御座いませんでした。 コメント頂きました様に自力で少しずつ頑張ってみます! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問