- ベストアンサー
メソッドの引数に指定されているインタフェースについて
最近サーブレットをいじっているので例としてサーブレットを扱いますが、一般的な話題として扱っていただければと存じます。 非常に質問を文章化しにくいのですが・・ たとえば、クラスHttpServletには以下のようなメソッドがあります。 doGet(HttpServletRequest req, HttpServletResponse resp) このメソッドの引数に指定されているHttpServletRequest/Responseはいずれもインタフェースなわけですが、メソッドの引数にインタフェースを指定するというのは、具体的にどういうことなのでしょうか? これがたとえばintだったりStringだったりした場合は簡単にイメージできるのですが、インタフェースだとさっぱりわかりません。 質問がわかりにくいかもしれませんが、よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
よくやるのはMapとか。 例えば次のようなメソッドがあったとして doMethod(Map m){} これはHashtableを引数にとることもできるし、 HashMapを引数にもできます。 Hashtable ht = new Hashtable(); HashMap hm = new HashMap(); // どっちもOK doMethod(ht); doMethod(hm); 正しく言うと、Mapインターフェースを実装したクラスの変数を 引数に取ることができるのです。 仮にこれができなかった場合 doMethodにHashtableとHashMap両方の引数を 取れるようにしようとすると doMethod(Hashtable ht){} doMethod(HashMap hm){} というように処理は同じなのに 引数の取りたいクラス型の数だけメソッドを 準備しなくてはならなくて面倒ですよね? インターフェースを実装すると そのインターフェースで定義されたメソッドを 必ず定義しなくてはいけません。 つまり、逆に言うとインターフェースが実装されていると そのメソッドを持っていることが保証されるわけで 同じようなクラスに対する共通的な処理をひとつのメソッドで まとめることができるメリットがあります。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
すみません, もちろん「実装」です. あと, たとえば「データをソートする」メソッドではだいたいインターフェース Comparator を引数に持ちます. こうすることで, ソートするときの順序をユーザが自由に決められます.
お礼
ご回答ありがとうございました。大変参考になりました。
- OKbokuzyo
- ベストアンサー率43% (130/296)
#2です。 もうひとつ大事なメリットを書き忘れたので追記です。 例えばあなたがHashMapを機能拡張した HashMapOrgクラスを作成したとします。 Class HashMapOrg extends HashMap{} 先ほどのdoMethodは、 このHashMapOrg型の変数も 引数として取ることができます。 HashMapOrg hmo = new HashMapOrg(); doMethod(hmo); もちろんMapインターフェースを実装したクラスでも OKです。 Class HashMapOrg imprements Map{省略} つまり、引数にインターフェースを指定することによって 今後同じインターフェースを持つ新しいクラスができても そのクラス型の変数もまた引数にとることができます。 つまり、新たに doMethod(HashMapOrg hmo){} というメソッドを必ずしも追加しなくても良くなるので メソッドを持つクラスを修正する必要がなくなるメリットがあります。
- Tacosan
- ベストアンサー率23% (3656/15482)
そのインターフェースを実現している任意のクラスのオブジェクトを渡すことができる.
お礼
実現とは、実装という理解でよろしいですか?
お礼
勉強不足で、おっしゃっていることの意味があまり理解できません(汗) ともあれ、以下の点は理解できました。ありがとうございます。 >正しく言うと、Mapインターフェースを実装したクラスの変数を >引数に取ることができるのです。