🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

2回答

1252閲覧

interfaceに無いメソッドを実装したい

O_sato

総合スコア13

Java

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

0グッド

1クリップ

投稿2019/09/28 20:59

interfaceを実装したクラスでinterfaceには無いメッソッドを記述したいのですが、エラーになります。

以下の既存のクラス内に新たにinterfaceには無いメッソッド

public int getIndex(String sid){   return m_data.indexOf(sid); }

を追加したいのですが、そのメソッドを呼び出すメソッドを記述すると

シンボルを見つけられません
シンボル: メソッド getIndex(String)
場所: インターフェース ListModel

とエラー表示されます。

int index; index = jListCustomers.getModel().getIndex(sid);

既存のクラス

private static class MyListData extends javax.swing.AbstractListModel { private java.util.List m_data; public MyListData(java.util.List data) { m_data = data; } public Object getElementAt(int index) { return m_data.get(index); } public int getSize() { return m_data.size(); } }

既存のクラスにメソッドを追加

private static class MyListData extends javax.swing.AbstractListModel { private java.util.List m_data; public MyListData(java.util.List data) { m_data = data; } public Object getElementAt(int index) { return m_data.get(index); } public int getSize() { return m_data.size(); } //これを追加 public int getIndex(String sid){ return m_data.indexOf(sid); } }

既存のクラスの親クラス

public abstract class AbstractListModel<E> implements ListModel<E>, Serializable { protected EventListenerList listenerList = new EventListenerList(); /** * Adds a listener to the list that's notified each time a change * to the data model occurs. * * @param l the <code>ListDataListener</code> to be added */ public void addListDataListener(ListDataListener l) { listenerList.add(ListDataListener.class, l); } /** * Removes a listener from the list that's notified each time a * change to the data model occurs. * * @param l the <code>ListDataListener</code> to be removed */ public void removeListDataListener(ListDataListener l) { listenerList.remove(ListDataListener.class, l); } /** * Returns an array of all the list data listeners * registered on this <code>AbstractListModel</code>. * * @return all of this model's <code>ListDataListener</code>s, * or an empty array if no list data listeners * are currently registered * * @see #addListDataListener * @see #removeListDataListener * * @since 1.4 */ public ListDataListener[] getListDataListeners() { return listenerList.getListeners(ListDataListener.class); } /** * <code>AbstractListModel</code> subclasses must call this method * <b>after</b> * one or more elements of the list change. The changed elements * are specified by the closed interval index0, index1 -- the endpoints * are included. Note that * index0 need not be less than or equal to index1. * * @param source the <code>ListModel</code> that changed, typically "this" * @param index0 one end of the new interval * @param index1 the other end of the new interval * @see EventListenerList * @see DefaultListModel */ protected void fireContentsChanged(Object source, int index0, int index1) { Object[] listeners = listenerList.getListenerList(); ListDataEvent e = null; for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == ListDataListener.class) { if (e == null) { e = new ListDataEvent(source, ListDataEvent.CONTENTS_CHANGED, index0, index1); } ((ListDataListener)listeners[i+1]).contentsChanged(e); } } } /** * <code>AbstractListModel</code> subclasses must call this method * <b>after</b> * one or more elements are added to the model. The new elements * are specified by a closed interval index0, index1 -- the enpoints * are included. Note that * index0 need not be less than or equal to index1. * * @param source the <code>ListModel</code> that changed, typically "this" * @param index0 one end of the new interval * @param index1 the other end of the new interval * @see EventListenerList * @see DefaultListModel */ protected void fireIntervalAdded(Object source, int index0, int index1) { Object[] listeners = listenerList.getListenerList(); ListDataEvent e = null; for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == ListDataListener.class) { if (e == null) { e = new ListDataEvent(source, ListDataEvent.INTERVAL_ADDED, index0, index1); } ((ListDataListener)listeners[i+1]).intervalAdded(e); } } }

親クラスのinterface

public interface ListModel<E> { /** * Returns the length of the list. * @return the length of the list */ int getSize(); /** * Returns the value at the specified index. * @param index the requested index * @return the value at <code>index</code> */ E getElementAt(int index); /** * Adds a listener to the list that's notified each time a change * to the data model occurs. * @param l the <code>ListDataListener</code> to be added */ void addListDataListener(ListDataListener l); /** * Removes a listener from the list that's notified each time a * change to the data model occurs. * @param l the <code>ListDataListener</code> to be removed */ void removeListDataListener(ListDataListener l); }

使用環境はJava SE1.8とNETBeans IDE 8.2です。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

Java

1List list = new List(); 2// 中略:ここでlistに要素を追加する 3ListModel listModel = new MyListData( list ); 4int index = listModel.getIndex( "hoge" );

ひょっとして、上記の様なコードを書いていませんか?

ListModel型の変数にインスタンスへの参照を代入した場合、ListModelに無いメソッドは呼び出せません。
listModelの型をMyListData型に変更するか、ListModelインタフェースにgetIndex()メソッドを追加するかしないと、コンパイルエラーになります。

投稿2019/09/28 23:58

rtr1950x

総合スコア298

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

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

O_sato

2019/09/29 01:13

回答ありがとうございます。 ListModelインタフェースにgetIndex()メッドを追加しようとすると 「javax/swing/ListModel.javaは/Library/Java/JavaVirtualMachins/jdk1.8.0_201.jdk/Contents/Home/src.zip内にあるため、読み取り専用です。」 となってしまうので何か方法がないか質問させていただいた次第です。 listModelの型をMyListData型に変更、というので進めてみます
rtr1950x

2019/09/29 05:52

ListModelはライブラリ内のインタフェースでしたか。それでは修正不可能ですね。 「index = jListCustomers.getModel().getIndex(sid);」のjListCustomersの定義が不明ですが、差し支えなければ、呼び出し部分の完全なソースを提示して頂けないでしょうか? そうすれば、より適切に回答出来るかと思います。 またjimbeさんが解答されている様にキャストする方法もありますが、この場合はgetModel()がListModel以外のインスタンスを返すことも考慮してコーディングしないと、実行時エラーが発生する可能性があります。ご留意ください。
O_sato

2019/09/29 11:55

ご丁寧にありがとうございます。 明後日の増税に向けて進めておりまして、取り急ぎお礼のみ申し上げます。 もうずっと不眠不休に近い状態です。
guest

0

ベストアンサー

jListCustomers.getModel() の時点で getModel の返す型以外のメソッドは使えません.

キャストして

java

1index = ((MyListData)jListCustomers.getModel()).getIndex(sid);

では如何でしょうか.

投稿2019/09/29 04:16

jimbe

総合スコア13202

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

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

O_sato

2019/09/29 11:56

回答ありがとうございます。 なんとか先に進めそうです。感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問