Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:インターフェースについて)

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

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

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

  • ベストアンサー
回答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