いまサーブレットをやっています。

Java言語仕様では、

「インターフェースの定義には、メソッドの定義を書いてはいけない」
(メソッドの定義はそのインターフェースをimplementsしたクラスのなかで
オーバーライドする)

ということになってますよね?

…でも、

APIリファレンスを読むと、
インターフェースHttpServletRequestのメソッドgetParameterには、
「リクエストパラメータの値をString型として返す」と書かれています。

↑これって上記のJava言語仕様と矛盾してませんか?
まるでどこかでgetParameterメソッドの定義がなされているかのようです。

これってどういうことでしょう?
考えれば考えるほど、訳わかりません。とっても混乱中です(-_-)

A 回答 (3件)

そうそう、実際にソースが見られたらいいんですが、HttpServletRequest


のgetParameterのところは、
String getParameter();
としか書いてないと思いますよ。
    • good
    • 0

ああ、余計に説明しすぎている気がするわけですね。

もっと抽象的に
「getParameterはなんだかわからないけどとにかくString型を
返す」
だったらわかるのに、と?
実際、implementsするクラスでは、getParameterとしてランダム
な文字列やらあなたの名前やらを返すメソッドを定義してもJava
言語仕様としては間違いではありません。

でもそれじゃあ意味のある名前をメソッドにつけるのも無駄になり
ませんか?「get1」「get2」でもいいような。

あるクラスがインタフェースをimplementsするというのは、
そのクラスが宣言されたメソッドをすべて完備していて、
そのインタフェースの役割を演じることができる、ということを
約束するものです。逆に漏れがあればコンパイラが怒ってくれると。
ですからドキュメントとして各メソッドの役目をある程度解説する
のは、インタフェースの本来の意図を伝えるものとして意味がある
ことです。

比喩としては、「高級アパートというのはバス、トイレ、洗面台を
完備していなければならない」という法律の細則に「バスは体を
洗浄したり湯船で体を暖めるサービスを提供する」とあるのを、
実際にアパートを建築する業者が「そりゃ具体的に説明しすぎて
ないか?まるでどこかにもうあるアパートのことを言ってるみたい
じゃないか」と文句を言っているのに近いです。実際はシャワーだけ
とか、庭の片隅においてあるドラム缶だって立派な「バス」じゃない
か、と。極端な話、ダンボール箱と洗面器だけでトイレと洗面台と
称しても、法律的には違反じゃないけど、人道的にいかがなものか。

「リクエストパラメータの値を返す」でも、十分抽象的ではあります。
実際にはパラメータをこっそりどこかのファイルにログとして
吐き出しておいてから返してもいいし、データベースにためておいて
一番古いものを検索して返してもいい。まずいパラメータの値は
検閲するような仕組みでもいい。要は、それをimplementsした
クラスが、getParameterを「リクエストパラメータの値を
返すメソッド」として使えればいいわけです。それくらいは説明
してくれないと、利用者としては不便です。
    • good
    • 0
この回答へのお礼

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


3度も投稿してくださって本当にありがとございます。
とても役に立ちました。

お礼日時:2001/05/28 12:28

ああ、それは「宣言」と「定義(実装)」を混同してしまっている


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

インタフェースHttpServletRequestを実装するクラスは、
Stringクラスの値を返すgetParameterメソッドを定義しなければ
ならない、とインタフェースでは「宣言」されていることを
表しています。

この回答への補足

どうやら、こちらの言葉不足で誤解を与えてしまったようです。

「インターフェースの定義には、メソッドの定義を書いてはいけない」の部分を以下のように訂正します。

「インターフェースの宣言には、メソッドの処理内容を定義してはいけない」

つまり僕が知りたいのは、インターフェース宣言ではメソッドの処理内容を定義してはいけないはずなのに、APIリファレンスを見るとそのメソッドの処理内容というか機能みたいなのが書かれてあるのでおかしいのではないか、ということなんです。
どうぞご存知でしたら教えてください。

補足日時:2001/05/27 10:02
    • good
    • 0

このQ&Aに関連する最新のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ