【先着1,000名様!】1,000円分をプレゼント!

Javaを勉強しております。

インターフェースの使い方を知ったのですが、その利点がわかりません。
インターフェースの記述の仕方はクラスによく似ていますが、インターフェースでできること(フィールドやメソッドを書く)はクラスでもできると思います。
インターフェースでしかできないことはあるのでしょうか?
インターフェースはどのような場面で活用するのが有効なのでしょうか?

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

A 回答 (7件)

#6です。

ちょっとだけ、訂正。


はたまた

 public void actionPerformed(ActionEvent event){
  if( /* getSource()の戻り値の内容が、あるコンポーネントクラスCのインスタンスと同じ時 */ )){
   // イベントハンドラクラスAにおいて、処理される内容をここに記述。
  }
 }

というようになっているかもしれません。


のコメント文の所を、


はたまた

 public void actionPerformed(ActionEvent event){
  if( /* getSource()の戻り値の内容が、あるコンポーネントクラスCのインスタンスと同じ時 */ )){
   // イベントハンドラクラスCにおいて、処理される内容をここに記述。
  }
 }

というようになっているかもしれません。


に変更。
    • good
    • 0

概念的な事に関しては、もう一通り出揃ったと思いますので、私の方からも同じく具体例でいきます。



>インターフェースでしかできないことはあるのでしょうか?
イベントハンドラ

>インターフェースはどのような場面で活用するのが有効なのでしょうか?
抽象化や再利用性を高めたい時。

Swingプログラミングを行っていく上での便利な機能の一つに、「イベントハンドラ」というのがあります。(J2MEにて有名なiアプリやMIDletなどでも、基本的には同じです。)実際には、J2SEにてイベントハンドラを実現するためには、以下のような手順となります。

(1)イベントハンドラが行われるクラスにてActionListenerインターフェースを実装する。
(2)各コンポーネントクラスのインスタンスに、addActionListenerメソッドを使用してアクションリスナーを設定する。
(3)actionPerformedメソッドをオーバーライドして、実際にイベントが発生した時に行われる処理を実装する。

詳細なプログラムが見たい方は、以下のサイト内の赤文字の部分などを参考にしてください。

JavaでHello World > Swing(イベント)編
http://www.hellohiro.com/swingevent.htm

ここで重要な事は、オーバーライドされたactionPerformedメソッドの中身が、各々のJavaアプリケーションによって違うという事です。例えば、

 public void actionPerformed(ActionEvent event){
  if( /* getSource()の戻り値の内容が、あるコンポーネントクラスAのインスタンスと同じ時 */ )){
   // イベントハンドラクラスAにおいて、処理される内容をここに記述。
  }else if( /* getSource()の戻り値の内容が、別のコンポーネントクラスBのインスタンスと同じ時 */ ){
   // イベントハンドラクラスBにおいて、処理される内容をここに記述。
  }
 }

というようになっているかもしれませんし、はたまた

 public void actionPerformed(ActionEvent event){
  if( /* getSource()の戻り値の内容が、あるコンポーネントクラスCのインスタンスと同じ時 */ )){
   // イベントハンドラクラスAにおいて、処理される内容をここに記述。
  }
 }

というようになっているかもしれません。実際には、Sun Microsystems, Inc.の人達にとっても、どのようなイベントが発生し(Buttonを押したりとか、ComboBoxのいずれかを選択したりとか・・)、その事によってどういったような処理を行うのかなどについては、知ったこっちゃないわけですよ(業務レベルによれば仕様だったりとか、社外秘に絡んできたりすることなので)。ただ、「とりあえず、大元の枠組みに関しては用意しておきましたので、後は担当されているJavaプログラマーさん、詳細な実装の方をよろしくお願いします。」って事なんですよ。

これが、他の回答者さんも述べられていた「宣言と実装を分離」ということなんですね。

参考URL:http://www.techscore.com/tech/J2SE/UI/3.html
    • good
    • 0

分かりやすいかどうかはともかく、例を挙げてみます。


例えば、あるシーフードレストランで「フグを材料にしてディナーを作る」
という企画があったとします。

class Restaurant{
 //ディナーを提供する
 Dinner serveDinner(Zairyo hugu){
  //ディナー
  Dinner dinner;
  //ここでディナーを作る作業があって、その結果ディナーができる
  
  //ディナーを返す
  return dinner;
 }
}
ここで、ディナーを和食にするか、フレンチにするか(フレンチでフグがあるかどうかは知らないけど)
まだ決まってない場合、これ以上メソッドが書けず、このメソッドは未完成のままです。
でも、ディナーを作るには「フグが調理できる」ことが必要で、和食でもフレンチでも変わりません。

そこで、「フグが調理できる」インターフェースを作ります。
interface HuguCookable{
 Dinner makeDinner(Zairyo hugu);
}
これがあれば、さっきのメソッドはとりあえず完成します。
class Restaurant{
 HuguCookable cook; //フグが調理できるコックさん
 
 //ディナーを提供する
 Dinner serveDinner(Zairyo hugu){
  //ディナー
  Dinner dinner;
  //ディナーを作る
  dinner = cook.makeDinner(hugu); //実際にcookが誰かわからないけど、これでディナーは完成!
  //ディナーを返す
  return dinner;
 }
}

あとは、cookに和食の料理人でもフレンチの料理人でも何でもいいので、
「フグが調理できる人」(つまり、HuguCookableをimplementsしたクラス)なら、
ディナーを作ることができるようになるのです。
和食やフレンチだけでなく、中華やイタリアン(イタリアンでフグ?)であろうと
「フグが調理できる」コックさんなら、ディナーを作ることができるのです。
    • good
    • 2

PeterCordの「Javaオブジェクト設計」当たりを読むと良いのですが。



設計の場合、インタフェース中心で考えると楽です。例えば「読み込んだデータを配列にして返す」機能を考えるときは、

・読み込み元は、ストリームから
・配列は、IDataObjectインタフェース
とざっくり決めて、IDataReaderインタフェースをデザインします。

interface IDataReader {
public void IDataObject[] Load(InputStream input);
}
クラスの継承とかはこの時点で考えません。単一継承しかできないJavaでは継承構造は慎重に考える必要がありますが、インタフェースはいくらでも可能なので、「まずはインタフェースで」設計します。
#ジェネリックが使えるならさらに柔軟になりますが

インタフェースの利点は、クラスがもつ制約に縛られずに設計が出来ることです。
逆にそれがデメリット(実装を共有できない)になる場合もありますが、その辺は委譲や継承でなんとかします。

ネットや書籍で調べるなら、「委譲」をキーワードにしてみてください。
    • good
    • 1

Javaは詳しくないのですが・・・



No.2さんの回答のとおりで、宣言と実装を分離させるのが目的ですね。
ソフトウエアの開発中、あるいは完成後に仕様変更が発生したとき、「この変更はどれだけのモジュールに影響を与えるか」って検討する場面が多いです。このとき、個々のソースコード詳細を追いかけるのは大変です。でも、信頼あるインターフェースが明記されていれば、影響範囲の調査作業が軽減されます。それは、実装コードが1行も完成してなくても、可能になります。

また、プログラムの設計においても、単なる要求機能を記述したドキュメントよりも、インターフェースまで記述するのなら、あまりいいかげんな設計はできません。

つまりは、設計精度、開発効率、保守効率などをアップするために必要なものだと思います。
もし全てを1人で開発するなら、不要なしろものかもしれませんね。

ちなみに、(現在は)少人数開発がメインのRuby on Railsだと、クラスはあっても、インターフェースは登場しません。いくらメリットがあろうとも、「似たような作業は繰り返さない」という原則に反するのでしょうね。
    • good
    • 1

インターフェースは宣言とその実装を分離させること自体がそもそもの目的なので


一般的なクラスとの実装可否を比較するのは少し間違っています。
インターフェースとクラスの決定的な違いは、実装内容を自身が知っているか知らないか、という点です。

と、少し教科書のような内容を記述しましたが、なかなか理論的に理解するのは難しいと思います。
ましてやよくある例え話などで理解してもそれは実践からは程遠いです。

・入力値をAというファイルに出力する。
・入力値をBをいうファイルに出力する。
呼び出し側はこのどちらかをメソッドとしてcallするわけですが
その実装内容までを呼び出し側が知る必要はないですよね。
であれば同じインターフェースを持った実装クラスを作成し、あとはそのクラスに任せてしまう。
このように「値を出力する」という宣言部と「どのように出力するか」という実装部を分離させるためにインターフェースが存在します。

本末転倒な思考ですが、上記のような作りになっていれば
・呼び出し側の実装
・Aクラス(Aファイルに出力)の実装
・Bクラス(Bファイルに出力)の実装
と、それぞれ別の開発者が実装を分担することもできます。
    • good
    • 1

Javaは多重継承を認めていませんが、多重継承を行った方がClassの構造がきれいになるなど利点が欠点を勝るときに多重継承の代わりに使うことが多いです。

    • good
    • 4

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qなぜインタフェースを使うのか?

カテゴリはJavaですが、オブジェクト指向という観点での質問です。

私はオブジェクト指向を勉強中です。(C#)
そこで、疑問に思ったのがタイトルで示したインタフェースについてです。
以下に疑問を列挙します。

1.インタフェースはなぜ使うのですか?
2.使うメリットはなんですか?
3.インタフェースのインスタンスって作れるのですか?
4.インタフェースは必ずどこかのクラスに継承されないといけないのですか?
 単体では何もできないのですか?
5.具体的な使い方を教えてください。

全部でなくてもよいのでわかる方ご教授よろしくお願いいたします。

Aベストアンサー

インターフェースとは「役割」です。
一般的なインターフェースの命名規則は「~ableを末尾に付ける」とあります。例えば「比較できる」なら「ICompareble」です。
メディア再生ならplay,stop等を持ったIPlayableインターフェースが考えられます。これで動画、音楽、静止画が文字通り「再生できます」。

クラスは実装とインターフェースの両方を継承しますが、これでは不便なことが沢山あります。最も不便なのは、余計なメソッドが沢山付いてくること、多重継承でもしない限り、継承だけでは機能を共有しきれない(多重継承は多重継承で、別の問題がある)事です。

インターフェースにはこの制約がありません。「~ができる」という役割に必要なメソッド群を定義し、その役割を持たせたい複数のクラスに実装させれば良いのです。
また逆に、1つのクラスに複数の役割を持たせることができます。


インターフェースは、引数の型指定に使うと用途がよく分かります。
元のインスタンスが何を継承していようと、インターフェースを通じて操作できるのはそのインターフェースに定義されたメソッドだけ、つまり純粋に「ある役割について操作したい」というメソッドを定義できます。


1.インタフェースはなぜ使うのですか?
 継承では制約が多い場面で、特定の「役割」に基づいた操作を定義したいとき、インターフェースを使います。

2.使うメリットはなんですか?
 継承より制約が少ないことです。中身が空っぽというデメリットは、「委譲」で回避できます。委譲とは、実装済みのクラスに処理を委ねてしまう(単なるクラス呼出し)です。

3.インタフェースのインスタンスって作れるのですか?
 作れませんが、インターフェースの引数や変数に、インターフェースを実装したクラスのインスタンスを代入できます。この辺の使い勝手は普通のクラスと同じです。

4.インタフェースは必ずどこかのクラスに継承されないといけないのですか?
 単体では何もできないのですか?
 中身がありませんし、それだけではインスタンス化できませんから、YESです。

5.具体的な使い方を教えてください。
 理論的な話なら「Javaオブジェクト設計」というペーター・コード氏の著作をお薦めします。

 C#での具体例なら、参考URLにプラグインの作り方が載っています。

参考URL:http://dobon.net/vb/dotnet/programing/plugin.html

インターフェースとは「役割」です。
一般的なインターフェースの命名規則は「~ableを末尾に付ける」とあります。例えば「比較できる」なら「ICompareble」です。
メディア再生ならplay,stop等を持ったIPlayableインターフェースが考えられます。これで動画、音楽、静止画が文字通り「再生できます」。

クラスは実装とインターフェースの両方を継承しますが、これでは不便なことが沢山あります。最も不便なのは、余計なメソッドが沢山付いてくること、多重継承でもしない限り、継承だけでは機能を共有しきれ...続きを読む

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Q「ラッパークラス」の存在意義が分かりません。

「ラッパークラス」の存在意義が分かりません。

ラッパークラスの使い方などについての解説はよく目にしますが、
その意義となると、明確な説明を見たことがありません。
(本質問では、使い方を質問しているわけではありません。)

どういう意味で、便利なのか、
つまり、その存在価値について、お聞きしたいのです。

これがないと乗り越えられない壁があるのでしょうか。
その壁を乗り越えるための道具として、用意されたものであるなら、
その壁というものを教えて頂きたいです。

どなたか宜しくお願い致します。

Aベストアンサー

個人的に納得している状況を話しますね。
プリミティブなデータ(例えばint)はそれ自体に実体が
あるから、「インスタンス化」なんてしませんよね。
ということは「null」には絶対にならないわけです。
ところで、データベースからレコードを読み込み、整数型の
フィールドのデータを受け取ることを想定します。
そのフィールドがnullだった場合、受け取る変数がint型で
あったら、「nullであること」を表現できません。nullと
0は違いますからね。でも、Integer型の変数ならnullにする
ことができます。それにtoStringで編集したりできるのも
ウレシイところです。
あと、リフレクションをやると分かりますけど、実行させる
メソッドに渡す変数は本体の定義がプリミティブ型でも、
オブジェクト型の配列にする必要があるので、ラッパークラスに
限られます。

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q抽象クラスのメリット

抽象クラスを作成して、オーバーライドするならば、
普通のクラスを作成してオーバーライドしても同じ
ではないでしょうか。
オーバーライドする事を忘れない、というメリットでは
パンチが弱い気がします。
他に抽象クラスを使用する事によってのメリットは
ありますでしょうか?

Aベストアンサー

抽象クラスを使うということは、抽象クラスのメソッドは実装しないってことです。
普通のクラスを継承する場合は、オーバーライドする親クラスのメソッドは実装しなければコンパイルエラーになります。
空実装をしておけばいいですが、実際に実装する立場からすると抽象化しておくことで、明示的に実装させることができます。
「オーバーライドを忘れない」というメリットは、決してパンチが弱いものではありません。
自分で抽象クラスを作って、自分で実装をするならそう思うかもしれませんが、フレームワークとして公開することによって、その実装を知らなくても安全に使えるということにつながります。

Q「インターフェイス」って何の為に必要なんですか?

“値を変更できるフィールドがもてない”・“抽象クラスしかもてない”のに何の為に記述するんだろう?と思って、インターフェイスを入力せずに実行してみたのですが、入力してもしなくても同じ結果が出ました。 同じ結果が出るならなぜ必要なんですか?

************* コード ****************************************
//のりものインターフェイス
interface iVehicle{
void vShow();
}
//材料インターフェイス
interface iMaterial{
void mShow();
}
//車クラス
class Car implements iVehicle,iMaterial{
private int num;
private double gas;

public Car(int n, double g){
num = n;
gas = g;
System.out.println("ナンバー"+ num + "ガソリン量"
+gas + "の車を作成しました。");
}
public void vShow(){
System.out.println("車のナンバーは" + num +"です。");
System.out.println("ガソリン量は" + gas + "です。");
}
public void mShow(){
System.out.println("車の材質は鉄です。");
}
}
class Sample1{
public static void main(String[] args){
Car car1 = new Car(1234, 20.5);
car1.vShow();
car1.mShow();
}
}
**************************************************************
<実行結果>
「ナンバー1234ガソリン量20.5の車を作成しました。
 車のナンバーは1234です。
 ガソリン量は20.5です。
 車の材質は鉄です。              」
インターフェイスを記述してもしなくても、同じく上記の結果が
出ました。

※ちなみに抽象クラスもいったい何なのかよく分りません。

“値を変更できるフィールドがもてない”・“抽象クラスしかもてない”のに何の為に記述するんだろう?と思って、インターフェイスを入力せずに実行してみたのですが、入力してもしなくても同じ結果が出ました。 同じ結果が出るならなぜ必要なんですか?

************* コード ****************************************
//のりものインターフェイス
interface iVehicle{
void vShow();
}
//材料インターフェイス
interface iMaterial{
void mShow();
}
//車クラス
class Car implements iVehicl...続きを読む

Aベストアンサー

説明合戦に参戦します。
インターフェースは「ルール」です。
実世界で言うと、「単三型乾電池」のことです。単三型乾電池は、円柱状の形をしており、プラスが盛り上がっていて、マイナス方向からは電子が放出されるという決まりがあります。
電子機器は、「単三型乾電池」の形が合うように作られているので、単三型乾電池を使うことが出来ます。つまり、円柱状の凹みがあり、マイナス方向から電子を受け取るように出来ています。

しかし、「単三型乾電池」は単なるルールなので、この世の中には「単三型乾電池」は存在しません。あるのは「アルカリ単三型乾電池」や「ニッカド単三型乾電池」です。

「アルカリ単三型乾電池」や「ニッカド単三型乾電池」は「単三型乾電池」をimplementsしているクラスです。

さて、ここでなぜインターフェースを利用するかというと、電子機器が、「アルカリ単三型乾電池」を利用するように作成したとしましょう。例えば、利用できるアンペア数が固定されているものします。そうすると、「ニッカド単三乾電池」は使えないようになってしまいます。また、今後新しい電池が開発されても、動揺に利用できません。例えば「オキシドライト単三乾電池」も使えません。
こうなると、電子機器の使い勝手が悪くなってしまいます。

なので、電子機器は最低限のルールだけを利用して電池にアクセスするようにします。このルールが「単三型乾電池」です。

どうでしょう?

説明合戦に参戦します。
インターフェースは「ルール」です。
実世界で言うと、「単三型乾電池」のことです。単三型乾電池は、円柱状の形をしており、プラスが盛り上がっていて、マイナス方向からは電子が放出されるという決まりがあります。
電子機器は、「単三型乾電池」の形が合うように作られているので、単三型乾電池を使うことが出来ます。つまり、円柱状の凹みがあり、マイナス方向から電子を受け取るように出来ています。

しかし、「単三型乾電池」は単なるルールなので、この世の中には「単三型乾...続きを読む

QリクエストからArrayListのデータが取得出来ない

いつもお世話になっております。

表題の通り、リクエストからArrayListのデータが取得出来ないのです。

javaで、
ArrayList cmArray = new ArrayList();
データベースからデータ取得
request.setAttribute("category",cmArray.toArray());

jspで
ArrayList list = new ArrayList();
list = (List)request.getAttribute("category");
と取得しようとしています。
そうすると、java.lang.ClassCastExceptionが発生してしまいます。

どなたか分かる方がいましたら、ご教授下さい。
よろしくお願い致します。

Aベストアンサー

requestには、cmArray.toArray()でObjectの配列が入ってます。
なのでJSPでListで受け取ろうとしてClassCastExceptionが発生しています。

request.setAttribute("category",cmArray);
でいいんではないでしょうか。

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

QJavaで改行などが出来ないのです。

 Java の事で質問です。 
 

 System.out.println("このようにしても\n");

 改行できません。
 
 このようにしても\n   

 と表示されてしまいます。どうしてでしょう。ちなみにOSはMacOS9.1です。なにか関係があるのでしょうか?

Aベストアンサー

> class amigo{
> public static void main(String args[]) {
> System.out.print("aaaaaaaa");
> System.getProperty("line.separator");
> System.out.print("bbbbbbbb");
> }
> }
> のような使い方でしょうか?

String line_sep = System.getProperty("line.separator");
System.out.println("あいうえお" + line_sep + "かきくけこ");

こうです。

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい


人気Q&Aランキング