インターフェースとは?Java言語仕様との矛盾について

このQ&Aのポイント
  • インターフェースとは、サーブレットでよく使用される機能です。Java言語仕様では、インターフェースの定義にメソッドの定義は含まれず、implementsしたクラスでオーバーライドする必要があります。
  • しかし、APIリファレンスを見ると、インターフェースHttpServletRequestのメソッドgetParameterが定義されており、リクエストパラメータの値をString型で返すことが明記されています。
  • この状況からは、Java言語仕様との矛盾が生じているように思えます。getParameterメソッドの定義はどこにあるのか、と疑問を抱えています。
回答を見る
  • ベストアンサー

インターフェースについて

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

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

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

  • ベストアンサー
回答No.2

ああ、余計に説明しすぎている気がするわけですね。もっと抽象的に 「getParameterはなんだかわからないけどとにかくString型を 返す」 だったらわかるのに、と? 実際、implementsするクラスでは、getParameterとしてランダム な文字列やらあなたの名前やらを返すメソッドを定義してもJava 言語仕様としては間違いではありません。 でもそれじゃあ意味のある名前をメソッドにつけるのも無駄になり ませんか?「get1」「get2」でもいいような。 あるクラスがインタフェースをimplementsするというのは、 そのクラスが宣言されたメソッドをすべて完備していて、 そのインタフェースの役割を演じることができる、ということを 約束するものです。逆に漏れがあればコンパイラが怒ってくれると。 ですからドキュメントとして各メソッドの役目をある程度解説する のは、インタフェースの本来の意図を伝えるものとして意味がある ことです。 比喩としては、「高級アパートというのはバス、トイレ、洗面台を 完備していなければならない」という法律の細則に「バスは体を 洗浄したり湯船で体を暖めるサービスを提供する」とあるのを、 実際にアパートを建築する業者が「そりゃ具体的に説明しすぎて ないか?まるでどこかにもうあるアパートのことを言ってるみたい じゃないか」と文句を言っているのに近いです。実際はシャワーだけ とか、庭の片隅においてあるドラム缶だって立派な「バス」じゃない か、と。極端な話、ダンボール箱と洗面器だけでトイレと洗面台と 称しても、法律的には違反じゃないけど、人道的にいかがなものか。 「リクエストパラメータの値を返す」でも、十分抽象的ではあります。 実際にはパラメータをこっそりどこかのファイルにログとして 吐き出しておいてから返してもいいし、データベースにためておいて 一番古いものを検索して返してもいい。まずいパラメータの値は 検閲するような仕組みでもいい。要は、それをimplementsした クラスが、getParameterを「リクエストパラメータの値を 返すメソッド」として使えればいいわけです。それくらいは説明 してくれないと、利用者としては不便です。

fumi11
質問者

お礼

Headさんは専門家の方だけあって、さすがに文章も論理的ですね。 それゆえ頭の悪い僕としては、 Headさんの文章を一度読んだだけでは理解できませんでした。(-_-)?? でももう大丈夫です。 ちゃんと理解できました。(^ー^) 3度も投稿してくださって本当にありがとございます。 とても役に立ちました。

その他の回答 (2)

回答No.3

そうそう、実際にソースが見られたらいいんですが、HttpServletRequest のgetParameterのところは、 String getParameter(); としか書いてないと思いますよ。

回答No.1

ああ、それは「宣言」と「定義(実装)」を混同してしまっている のですね。用語の問題だと思いますよ。 インタフェースでは、メソッドの定義、すなわちその中身の 処理について実装を定義することはできません。(if (...) {...}みた いに) しかし、どういう名前のメソッドで引き数としてどういう型の 値を受けて、どういう型の値を返すか、を宣言することはできます。 というかそれが目的です。 インタフェースHttpServletRequestを実装するクラスは、 Stringクラスの値を返すgetParameterメソッドを定義しなければ ならない、とインタフェースでは「宣言」されていることを 表しています。

fumi11
質問者

補足

どうやら、こちらの言葉不足で誤解を与えてしまったようです。 「インターフェースの定義には、メソッドの定義を書いてはいけない」の部分を以下のように訂正します。 「インターフェースの宣言には、メソッドの処理内容を定義してはいけない」 つまり僕が知りたいのは、インターフェース宣言ではメソッドの処理内容を定義してはいけないはずなのに、APIリファレンスを見るとそのメソッドの処理内容というか機能みたいなのが書かれてあるのでおかしいのではないか、ということなんです。 どうぞご存知でしたら教えてください。

関連するQ&A

  • サーブレットでバイナリの入力データを扱いたい

    サーブレット/Java初心者です。 サーブレットで、 request.setCharacterEncoding("UTF-8"); String hoge1 =request.getParameter("hoge1"); String hoge2 =request.getParameter("hoge2"); のように、リクエストパラメータを取得しています。 hoge2だけ、UTF-8ではなく、バイナリデータとして解釈し、byte[]の変数に格納したい場合は、どうすればよいのでしょうか? APIのドキュメントを見ても、使えそうなメソッドがなくて困っています。

    • ベストアンサー
    • Java
  • RequestDispacherインターフェイスのことを知っている方がいたら・・

    マニアックな質問なのかもしれませんが・・ インターフェイス及び抽象メソッドの定義は ●インターフェイスに定義されているメソッドは必ず抽象メソッドである ●抽象メソッドにはメソッドのプロトタイプだけが定義されている だと思うのですが、 RequestDispatcherインターフェイスのforwardメソッドには既に 「サーブレットから他のリソースへ、requestオブジェクトとresponseオブジェクトを転送する」 という処理内容が定義されているように思います。>java.sun.comのapiドキュメント これってインターフェイスの原則から外れていると思うのですが、 どうなのでしょうか。「例外」もあるってことなんでしょうか。 おひまだったら解答をお願いいたします。

    • ベストアンサー
    • Java
  • 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のインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{   void show(); } class A{   public void show(){     System.out.println("A");   } } class B extends A implements X{ } public class Main{   public static void main(String[] args){     X x=new B();     x.show();   } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16

    • ベストアンサー
    • Java
  • メソッドの引数に指定されているインタフェースについて

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

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

    Java言語を学習している者です。 インターフェースについて理解できずに困っております。 ここでは、Runnableインターフェースを例にとります。 (1)正しいコード public class ThreadTest implements Runnable { public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (1)のコードは正常に動きます。 (2)間違ったコード (implements Runnableを記述しなかった場合) public class ThreadTest{ public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (2)のコードでは、 Thread th = new Thread(ins); で、 コンストラクタ―Thread(ThreadTest)は未定義です。 とエラーが出てしまいます。 確かに未定義なのですが、(1)でも定義していないように思えます。 Runnableインターフェースの働きのお陰だと言うことはわかるのですが、どういった働きによるものなのかがわかりません。 インターフェースのについて、 ・インターフェースのフィールドは必ず定数。 ・インターフェースのメソッドは必ず抽象メソッド。 ・インターフェースはインスタンスを作ることが出来ない。 ・抽象メソッドは必ず実装しなければならない。 は理解しているつもりです。 今回の質問をするに当たって、 RunnableのAPI http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Runnable.html を見たのですが、それでも理由が分からないので質問致します。 もし宜しかったら、APIの見方についてもコメントして頂けるとありがたいです。 宜しくお願いします。

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

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

  • サーブレットのコンパイルエラー

    会社の開発環境でコンパイルできたサーブレットを 自宅でコンパイルしようとすると、下のエラーが出てしまい困っています。だれか知恵を貸してください。 ちなみに自宅の開発環境は j2sdk1.4.0とtomcat3.2.3 です。 よろしくお願いします。 ----------------------------------- ReserveControlServlet.java:26: シンボルを解釈処理できません。 シンボル: メソッド setCharacterEncoding (java.lang.String) 位置 : javax.servlet.http.HttpServletRequest の インタフェース request.setCharacterEncoding("JISAutoDetect"); ^ ReserveControlServlet.java:33: シンボルを解釈処理できません。 シンボル: メソッド getRequestDispacher (java.lang.String) 位置 : javax.servlet.ServletContext の インタフェース sc.getRequestDispacher("/index.jsp").forward(request, response); ------------------------------------

    • ベストアンサー
    • Java
  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • APIリファレンスはどこにありますか

    初歩的な質問で申し訳ないのですがjavascriptで提供されている すべてのメソッドの説明がかかれたリファレンスのようなもの(言語仕様書?) はどこからダウンロードすればいいのでしょうか。 javaでいうと下記サイトのようなものはないのでしょうか。 http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

専門家に質問してみよう