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

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

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

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

Q&A

2回答

1594閲覧

java ジェネリクスについての質問

Kurokura

総合スコア5

Java

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

0グッド

0クリップ

投稿2020/04/22 15:06

以下のコードの出力結果が次のようになることを目指します。
Yaris/1500
Corolla/2500
Bear1/1000
Bear2/2000
Tacoma/3300
Bear3/1200

このコードには、ToyBoxTestの中のshowToysinBoxの中でエラーが起こっています。以下エラー文です。

ToyBoxTest.java:33: エラー: 不適合な型: CAP#1をToyに変換できません:
Toy o = v.get(i);
^
CAP#1が新しい型変数の場合:
CAP#1は? extends ObjectのキャプチャからObjectを拡張します
ToyBoxTest.java:34: エラー: シンボルを見つけられません
System.out.println(o.print_name());
^
シンボル: メソッド print_name()
場所: タイプToyの変数 o

エラーの直し方を教えて下さい。

java

1import java.util.ArrayList; 2 3/** 4 * ToyBox Example. 5 */ 6 7class ToyBox<T> { 8 9 private ArrayList<T> v = new ArrayList<T>(); 10 11 public void add(T t) { 12 // Complete add method with proper argument and method body 13 v.add(t); 14 } 15 16 public T get(int i) { 17 // Complete get method with proper argument and method body 18 return v.get(i); 19 } 20 21 public int getSize() { 22 // Complete getSize method with proper argument and method body 23 return v.size(); 24 } 25} 26 27public class ToyBoxTest { 28 public static void showToysinBox(ToyBox<? extends Object> v) { 29 /* Parameter with bounded wildcard to accept Toy and its subclasses*/ 30 // Complete showAnimalsinToyBox method with proper argument and method body 31 int i; 32 for(i=0; i<v.getSize() ;i++){ 33 Toy o = v.get(i); 34 System.out.println(o.print_name()); 35 } 36 } 37 38 public static void main(String[] args) { 39 40 // Create a "carBox" with proper sentence 41 ToyBox<Object> carBox = new ToyBox<Object>(); 42 Car t1 = new Car("Yaris", 1500); 43 Car t2 = new Car("Corolla", 2500); 44 carBox.add(t1); 45 carBox.add(t2); 46 showToysinBox(carBox); 47 48 // Create a "bearBox" with proper sentence 49 ToyBox<Object> bearBox = new ToyBox<Object>(); 50 Bear b1 = new Bear("Bear1", 1000); 51 Bear b2 = new Bear("Bear2", 2000); 52 bearBox.add(b1); 53 bearBox.add(b2); 54 showToysinBox(bearBox); 55 56 57 /* It is OK till now */ 58 59 // Next, create Box<Toy> 60 61 // Create a "toyBox" with proper sentence 62 ToyBox<Object> toyBox = new ToyBox<Object>(); 63 Car t3 = new Car("Tacoma", 3300); 64 Bear b3 = new Bear("Bear3", 1200); 65 toyBox.add(t3); 66 toyBox.add(b3); 67 showToysinBox(toyBox); 68 } 69} 70 71abstract class Toy { 72 // Complete Toy Class 73 public String toyName; 74 public int toySize; 75} 76 77class Car extends Toy{ 78 public Car(String name, int size){ 79 super.toyName = name; 80 super.toySize = size; 81 } 82 83 public String print_name(){ 84 return super.toyName+"/"+super.toySize; 85 } 86} 87 88class Bear extends Toy{ 89 public Bear(String name, int size){ 90 super.toyName = name; 91 super.toySize = size; 92 } 93 94 public String print_name(){ 95 return super.toyName+"/"+super.toySize; 96 } 97 98}

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

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

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

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

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

guest

回答2

0

java

1class ToyBox { 2 3 private ArrayList<Toy> v = new ArrayList<>(); 4 5 public void add(Toy t) { 6 // Complete add method with proper argument and method body 7 v.add(t); 8 } 9 10 public Toy get(int i) { 11 // Complete get method with proper argument and method body 12 return v.get(i); 13 } 14 15 public int getSize() { 16 // Complete getSize method with proper argument and method body 17 return v.size(); 18 } 19} 20 21public class ToyBoxTest { 22 public static void showToysinBox(ToyBox v) { 23() 24 public static void main(String[] args) { 25 26 // Create a "carBox" with proper sentence 27 ToyBox carBox = new ToyBox(); 28() 29abstract class Toy { 30 // Complete Toy Class 31 public String toyName; 32 public int toySize; 33 public abstract String print_name(); 34} 35(以下、適宜@overrirde付加) 36

で十分で、ジェネリクスが登場する余地はなさそうです。
(動くコードは書いてないので瑕疵はあるかも)

投稿2020/04/23 01:34

quickquip

総合スコア11038

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

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

0

その時点でのvは、ToyBox<何か>なので、そこからのgetはObjectで得ることになります。Toyである保証がありません。
Toyとして取り出したい、そもそも前提としてToyBoxはToyを入れたものだけ扱うのならば、メソッドの引数で次のように定義します。

java

1 public static void showToysinBox(ToyBox<? extends Toy> v)

投稿2020/04/22 15:46

swordone

総合スコア20651

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

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

Kurokura

2020/04/22 15:53

v.get(i)での戻り値を参照して、v.get(i).print_name()のような感じで、toyNameとtoySizeを出力したいのですが、どのようにコードを記述すればよいでしょうか。
swordone

2020/04/22 16:28

いや、なんで私の回答完全無視?
swordone

2020/04/22 17:20

って、よく見たらジェネリクス部分全部Object… 何がしたいの?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問