- ベストアンサー
Java言語のインタフェースについて
- Java言語のインタフェースについての理解に困っています。
- Runnableインターフェースを例に取ると、implements Runnableを記述しなかった場合はエラーが発生します。
- インターフェースのフィールドは定数であり、メソッドは抽象メソッドであることを理解していますが、Runnableインターフェースの具体的な働きについて分かりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> Thread th = new Thread(ins); ここでエラーを起こしているので、 Thread のドキュメントを見たほうがいいんじゃないかな? すると、コンストラクタの引数に取れる型が決まっていることがわかりますよ。 で、この場合は Thread(Runnable target) のタイプのコンストラクタが該当すると思います。 ThreadTest クラスは Runnable インターフェースの実装が終わっているので、 Runnable に cast(型変換)することが可能です。 ThreadTest ins = new ThreadTest(); Runnable run = ( Runnable ) ins; Thread th = new Thread(run); th.start(); (2) のソースでは上記のようには書けないですよね。 Threadクラスは Runnable の run メソッドにしか関心がないので、run メソッドの実装が担保されていればそれでいいのです。 インターフェースを implements するということは、必要なメソッドの実装を担保していると考えることが出来るんじゃないかな?(していないとコンパイルでエラーになるでしょ) また Serializable インターフェースのように、特に実装すべきメソッドがなく一貫性を担保するために利用する場合もあります。
その他の回答 (2)
- yamada_g
- ベストアンサー率68% (258/374)
>コンストラクタ―Thread(ThreadTest)は未定義です。 これはThreadクラスにそのようなコンストラクタが定義されていないという意味です。 ですので、 >(1)でも定義していないように思えます。 これは違います。ThreadのAPIを見てください。 http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Thread.html Thread(Runnable)というコンストラクタがあります。 これは引数としてRunnableインターフェース(を実装しているクラス)を受け取るコンストラクタです。 (1)ではThreadTestがRunnableインターフェースを実装しているので、 このコンストラクタを呼び出していることになります。 (2)はRunnableインターフェースを実装していないので このコンストラクタを呼び出すことはなく、 ThreadTestクラス・Objectクラスを引数に受け取るコンストラクタは存在しないため 上記のエラーになります。 今回の質問であればThreadクラスのAPIも見ることが出来れば自分で気づけたかもしれませんね。
- Tacosan
- ベストアンサー率23% (3656/15482)
「コンストラクタ―Thread(ThreadTest)は未定義です。」 というメッセージは 「クラス Thread のコンストラクタが定義されていない」 という意味ではなく 「ThreadTest を引数にとるコンストラクタが定義されていない」 という意味だろう.
お礼
回答ありがとうございます。 そこまではわかっていたのですが、何が起こっているのかがよくわからなくて……。 文が稚拙で申し訳ないです。
お礼
Threadの方のAPIも見たのですが、イマイチピンと来ず……。 APIの解説ありがとうございます! 自信を持ちましたので、後の学習に活かせそうです!