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

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

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

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

Q&A

解決済

2回答

826閲覧

JavaのArrayListからインタフェースに定義されていないメソッドを使用する方法

Rokuro_Asakura

総合スコア1

Java

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

0グッド

1クリップ

投稿2021/07/03 11:18

前提・実現したいこと

javaで自作のインタフェース型で定義したArrayListを作り、インタフェースを実装したクラスのオブジェクトをArrayListに追加した状態から
インタフェースに定義されていないgetメソッドを使って個別のクラスが持つフィールドの値をgetしたいのですが良い方法が思いつきません。

現状自分が思いつく限りでは、インタフェースに文字列を返すメソッドを用意して、そのクラスの持つフィールドを全て区切り文字を入れながら文字列に変換して文字列として返し、受け取った側で入手した文字列を区切り文字を見て解釈するような方法か
インタフェースを実装するすべてのクラスには共通しないメソッドも定義して、共通しないクラスではそのメソッドは呼び出さないようにするといったやってはいけなさそうな方法しか思い浮かびません。あとはフィールドをpublicに設定するとか…
もっと良い方法があれば教えていただきたいです。

また、そもそもArrayListを使うのが間違いだという場合には、他に、ある属性(サンプルならCustomer)の物をまとめて管理したい場合に、何か方法があれば教えていただきたいです。

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

Customerインタフェースにはメソッドが定義されていないので当然怒られました

Test.java:50: エラー: シンボルを見つけられません
customerlist.get(2).getVipNum();
^
シンボル: メソッド getVipNum()
場所: インタフェース Customer

該当のソースコード

java

1//サンプル 2import java.util.ArrayList; 3import java.util.List; 4 5interface Customer { 6 public int getNum(); 7} 8 9class Normal implements Customer{ 10 11 private int num; 12 13 public Normal(int num) { 14 this.num = num; 15 } 16 17 public int getNum() { 18 return num; 19 } 20} 21 22class Vip implements Customer { 23 24 private int num; 25 26 private int vipnum; 27 28 public Vip(int num, int vipnum) { 29 this.num = num; 30 this.vipnum = vipnum; 31 } 32 33 public int getNum() { 34 return num; 35 } 36 37 public int getVipNum() { 38 return vipnum; 39 } 40} 41 42class Main{ 43 public static void main(String args[]) { 44 List<Customer> customerlist = new ArrayList<>(); 45 46 List.add(new Normal(1)); 47 List.add(new Vip(2, 1)); 48 49 //ここでArrayListの2個目に入っているVipからvipnumの値が欲しい 50 //CustomerインタフェースにはgetVipNumは定義されていないので失敗する 51 customerlist.get(2).getVipNum(); 52 } 53}

試したこと

エラー原因を調べ、CustomerインタフェースとしてではなくVipクラスとしてgetする方法を探したが、見つからなかった。

補足情報(FW/ツールのバージョンなど)

javaバージョン11

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラー原因を調べ、CustomerインタフェースとしてではなくVipクラスとしてgetする方法を探したが、見つからなかった。

単に、((Vip)customerlist.get(2)).getVipNum();という選択肢もあるかと思います。

(もっとも、「インターフェースで代入しているのに、そのインターフェースにないメソッドを呼ばないといけない」時点で、設計がまずい気もします)

投稿2021/07/03 11:26

maisumakun

総合スコア145184

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

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

maisumakun

2021/07/03 11:37

> 、ある属性(サンプルならCustomer)の物をまとめて管理したい まとめて管理したいのに、固有のメソッドも呼ぶ必要があるのはどのような状況なのでしょうか?
Rokuro_Asakura

2021/07/03 11:39

よく考えたらクラスでキャストする方法もできそうですね。盲点でした。 やはり設計に問題がありますか… 今回は演習という形なのでクラスをチェックするメソッドを呼び出してからキャストして実行する方向で行こうと思います。ありがとうございました。
Rokuro_Asakura

2021/07/03 11:53

最初はクラスの実行するメソッドをを呼び出して処理する形にしようとしていたのですが、進めていくうちにクラスの外からフィールドを引っ張り出して処理しないと難しそうだという感じになってしまいまして… おっしゃる通り設計ミスです。
guest

0

それはそうでしょう。

Java

1Customer c = new Vip();

のようにしたら、処理内容はVip側であっても、

親で保持している限り、
『親が持っているメンバしか使えない』です。

getVipNumメソッドはCustomerクラスにはないので使えない。

どうしても子のメンバを使うなら『キャスト』するしかないと思います。

ですが、そういう使い方は『設計ミス』とされるようです。一般的に。

投稿2021/07/03 11:33

編集2021/07/03 11:34
BeatStar

総合スコア4958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問