• ベストアンサー

メソッドの引数に指定されているインタフェースについて

最近サーブレットをいじっているので例としてサーブレットを扱いますが、一般的な話題として扱っていただければと存じます。 非常に質問を文章化しにくいのですが・・ たとえば、クラスHttpServletには以下のようなメソッドがあります。 doGet(HttpServletRequest req, HttpServletResponse resp) このメソッドの引数に指定されているHttpServletRequest/Responseはいずれもインタフェースなわけですが、メソッドの引数にインタフェースを指定するというのは、具体的にどういうことなのでしょうか? これがたとえばintだったりStringだったりした場合は簡単にイメージできるのですが、インタフェースだとさっぱりわかりません。 質問がわかりにくいかもしれませんが、よろしくお願いいたします。

  • Java
  • 回答数4
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.2

よくやるのは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){} というように処理は同じなのに 引数の取りたいクラス型の数だけメソッドを 準備しなくてはならなくて面倒ですよね? インターフェースを実装すると そのインターフェースで定義されたメソッドを 必ず定義しなくてはいけません。 つまり、逆に言うとインターフェースが実装されていると そのメソッドを持っていることが保証されるわけで 同じようなクラスに対する共通的な処理をひとつのメソッドで まとめることができるメリットがあります。

Imagine128
質問者

お礼

勉強不足で、おっしゃっていることの意味があまり理解できません(汗) ともあれ、以下の点は理解できました。ありがとうございます。 >正しく言うと、Mapインターフェースを実装したクラスの変数を >引数に取ることができるのです。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

すみません, もちろん「実装」です. あと, たとえば「データをソートする」メソッドではだいたいインターフェース Comparator を引数に持ちます. こうすることで, ソートするときの順序をユーザが自由に決められます.

Imagine128
質問者

お礼

ご回答ありがとうございました。大変参考になりました。

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.3

#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)
回答No.1

そのインターフェースを実現している任意のクラスのオブジェクトを渡すことができる.

Imagine128
質問者

お礼

実現とは、実装という理解でよろしいですか?

関連するQ&A

  • doGetの引数に「入るモノ」について

    サーブレットにおけるクラスのdoGetメソッドについて 質問です(Tomcat3.2.1 + JDK1.3)。 public void doGet(HttpServletRequest request, HttpServletResponse response) 理屈で考えると、このdoGetメソッドの2つの仮引数 (request, response)には、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス ‥‥と、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス の2つのインスタンスが入れられるハズですよね。 そこで疑問なのが、 1. それら2つのクラスの名前はなんというのでしょう? (というのはインターフェースHttpServletRequestや インターフェースHttpServletResponseを 実装したクラスのメソッドの処理内容の定義を 見たいのです‥) 2. 誰がそのクラスをインスタンス化しているのでしょう? (サーブレットコンテナのTomcat? JRE? JVM?‥ いったい誰が?‥‥用語の区別も曖昧なのですが) 補足すると、 Javaアプリケーションのmainメソッドでは、 public static void main(String[] args) として、コマンドラインの引数がそのまま仮引数argsに 入る。じゃあ、サーブレットの場合はどうなのか? といった感じです。 2.のほうはトンチンカンな質問かもしれませんが、 1.の質問は切実です。 ご存知の方、教えてください。

    • ベストアンサー
    • Java
  • インタフェースのメソッド

    最近仕事でJAVAを使うことになり勉強し始めたのですが、分からないことがあります。 たとえばHTMLからPOST要求を受けるサーブレットでセッションを取得する際、 doPost(HttpServletRequest req , HttpServretResponse res){ HttpSession session = req.getSession(true) … } としますが、このgetSessionメソッドの中身はどこで実装されているのですか?reqインスタンスはHttpServletRequest型としか指定していませんが、HttpServletRequestはインタフェースなのでメソッドの実装をしていないと思うのですが・・・。 知らなくても「こうするものだ」と思っておけば問題はないのでしょうが、しっかり理解しておきたいのでよろしくお願いします。

  • doHeadメソッドを使いたい

    訳あって、doHeadメソッドを使ったサーブレットを作りたいのですが、 例題が無くて困っています。 いろいろ調べても、doHeadの説明は 「ヘッダだけを返す」 と書いてあるだけで、 ほとんどは実際の使用例になるとdoGetを使ったものになってしまっています。 doHeadを使う単純なサーブレットはどのように書いたらいいのでしょう? 何も表示しなくてもエラーさえ出なければかまいません。 public class HellodoHead extends HttpServlet{   public void doHead(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{   } } ためしにこのように何も記述しないで見たのですが、 HTTP Status 405 - HTTP の GET メソッドはこの URL ではサポートされていません。 というエラーです。 dogetメソッドが無いのに、GETリクエストを送った、ということらしいのですが、 ではheadリクエストのみを送ることはできるのでしょうか? 思いついたことがあれば何でもいいので、 回答いただけると助かります。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • サーブレット初歩に関して。

    package oty; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Otys */ public class Otys extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Otys() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } } 初期状態がこんな状態なんですが、これになにを追加したらhelloworldとでますか?? 普通にJAVA入門みたいに、System.out.printlnしたらいいんでしょうか??

    • ベストアンサー
    • Java
  • インターフェースについて

    いまサーブレットをやっています。 Java言語仕様では、 「インターフェースの定義には、メソッドの定義を書いてはいけない」 (メソッドの定義はそのインターフェースをimplementsしたクラスのなかで オーバーライドする) ということになってますよね? …でも、 APIリファレンスを読むと、 インターフェースHttpServletRequestのメソッドgetParameterには、 「リクエストパラメータの値をString型として返す」と書かれています。 ↑これって上記のJava言語仕様と矛盾してませんか? まるでどこかでgetParameterメソッドの定義がなされているかのようです。 これってどういうことでしょう? 考えれば考えるほど、訳わかりません。とっても混乱中です(-_-)

    • ベストアンサー
    • Java
  • サーブレットのコンパイルについて

    はじめまして。 学校の課題の方でJSP/サーブレットをやっているのですが、サーブレットのコンパイルが通りません。 プログラムとエラーと環境変数は以下の通りです。 【プログラム】 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { printWriter out = response.getWriter(); out.println("hello"); } } 【エラー】 HelloServlet.java:2: パッケージ javax.servlet は存在しません。 import javax.servlet.*; ^ HelloServlet.java:3: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.*; ^ HelloServlet.java:5: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : HelloServlet の クラス public class HelloServlet extends HttpServlet ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス ServletException 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:9: シンボルを解決できません。 シンボル: クラス printWriter 場所 : HelloServlet の クラス printWriter out = response.getWriter(); 【環境変数】 CATALINA_HOME C:\servletbook\apache-tomcat CLASSPATH %CATALINA_HOME%\common\lib\jsp-api.jar;%CATALINA_HOME%\webapps\atmarkit\WEB-INF\classes;%CATALINA_HOME%\common\lib\servlet-jsp.jar; よろしくお願いします。

  • 宣言のタイミング

    質問させてください。 Servletの中で、他クラスからの参照のできる static final String について何ですが、 例えば、 public class goo extends HttpServlet{ static final String CODE = "text/html;charset=Shift_JIS"; public void doPost(HttpServletRequest req,HttpServletResponse res) thows servletException,IOException{ res.setContentType(CODE); など、実際の値を入れるやり方は、分かるのですが、 Servlet内で、何らかの処理後の String を static final String 宣言をするには、どうしたらよいのでしょうか? 例えば、 public class goo extends HttpServlet{ public void doPost(HttpServletRequest req,HttpServletResponse res) thows servletException,IOException{ String para = req.getParameter(para); String param = new String(para.getBytes("8859_1"),"JISAutoDetect"); 等の時に、paramを static final String にしたいのです。 自分でも文法が出来てないとは思いますが、よろしくお願いします。

    • ベストアンサー
    • Java
  • doGetとdoPostの違い

    それぞれブラウザからのリクエストの種類に対応する メソッドがdoGet,doPost。 doGetはブラウザからGETでそのサーブレットに リクエストがあった時に、処理が始まるメソッド、 doPostは同じようにPOSTを受け取った時に動き出す ・・・・・ということなのですが、 doGetもdoPostも、中身のコーディングの仕方としては 同様でいいのでしょうか? いま、doGetでリクエストに対応する処理をうけつけて いるのですが、255バイトまでなのでdoPostのほうが いいということがかかれていました。 これは、ブラウザ:Servletのメソッドで対応してれば いいだけで、結局は送信量の違いだけですか? そのへんがよくわかってないので教えてください。 ちなみに、doGetでやってる処理は、 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Bean(workBean)のインスタンス作成 wk = new work_Bean(); //Bean処理実行 wk.Work(); ・ ・ ・ ・ //BeanをJSPに渡すためにHttpServletRequestオブジェクトにセット request.setAttribute("wk",wk) ; //ViewであるJSPを呼び出す RequestDispatcher rDispatcher = request.getRequestDispatcher("/kanri_JSP.jsp"); rDispatcher.forward(request,response); } こんなかんじでしてます。 あとは、ネットで、人のサンプルとかみると doGetメソッドに処理をかいており、doPostでは doGet(request,response);として doGetをよんでたりするんですが、 これは、PostでもGetと同様の処理ができると いうことですか? 基本的な質問過ぎるかとおもいますがおしえてください。

    • ベストアンサー
    • Java
  • メソッドの中に、作ったメソッドを呼び込みたいんですが

    メソッドの中に、作ったメソッドを呼び込みたいんですが シグネチャを int argCheck(String args[]) に指定して、 引数のチェック処理メソッドというものを作成してるんですが、 よくわからないんです。 内容は (1) 引数の数が1個でない場合、1を返却 (2) 引数が『aaa』でも『ZZZ』でもない場合、99を返却 (3) 以外は、0を返却 public class Test { public static void main(String args[]) { Test test = new Test(); int result = test.argCheck(args); test.argCheck(); //メソッドを呼び込み } private int argCheck(String args[]) { if(args[0].length != 1) // 引数の数が1以外の場合 { return 1; // 1を返す } else if (!args[0].equalsIgnoreCase("aaa") && !args[0].equalsIgnoreCase("ZZZ")) //引数が aaa でも ZZZ でもない場合(大/小文字区別せず) { return 99; // 99を返す } else // それ以外の場合 { return 0; // 0を返す } } }

    • ベストアンサー
    • Java
  • サーブレットの動作

    以下のようなサーブレットのプログラムがあります。 本サーブレットを実行すると、simpleDB.jspに飛ぶようになっています。 疑問点は以下です。 ・GetやPostを使って送られてくるデータがないのに、なぜ  本プログラムが動くのか分かりません(根本的に分かって  ないんですが)。 ・getServletContext().setAttribute("list", employeeList)で  listに設定をしてますが、listは飛ぶ先のsimpleDB.jspで定義  されています。なぜこのサーブレットで定義されていないものを、  設定することが可能なのでしょうか? 以上、ご回答頂けると幸いです。 ---------- import java.io.IOException; import文以下略 public class EmployeeServlet extends javax.servlet.http.HttpServlet { /** * 初期化メソッド * 社員一覧をapplicationスコープにセットします */ public void init() { EmployeeDAO dao = new EmployeeDAO();     //EmployeeDAOクラスは他で定義済み ArrayList<Employee> employeeList = dao.findAll(); getServletContext().setAttribute("list", employeeList); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * リクエストを処理するメソッド * simpleDB.jspに移動し、社員一覧を表示します */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nextPage = "/view/simpleDB.jsp"; ServletContext context = getServletContext(); RequestDispatcher rd = context.getRequestDispatcher(nextPage); rd.forward(request, response); } }

    • ベストアンサー
    • Java

専門家に質問してみよう