Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

interfaceのメソッドをimplementしてないのに

interface A{
int getvalue();
}

public class B implements A{
public int get(A a){
   int a = a.getValue();

}
}

こんなコードがありました。int a = a.getValue();のところでエラーが出ると思いますが、エラーが出ずに実際何か値が入っている場合って考えられますか。

つまり、interfaceのメソッドをimplementしてないのに関わらず、それを呼び出したりできる場合がありますか。

実際、仕事で使っているプログラムが非常に大きくて、どこに何があるかわからない状態です。

質問がはっきりしていないかもしれませんが、コメントをください。

3

回答

78506

閲覧

3件の回答

評価

0

引数の型がAというインターフェースなのに、なんで使えるのか?ということでしょうか。
だとすれば、それはインターフェースの意味を理解できていないということになります。

インターフェースは、渡されるクラスが実装するべきメソッドを定義するもので、クラス自体を決定しているわけではありません。
つまり、あるメソッドを持ってさえいれば、どんな実装のクラスでも渡ってきます。
インターフェースはモノではないので、インターフェースというモノが渡ってくることは、ありません。
実際にこのgetメソッドを呼び出している箇所では、Aインターフェースを持ったクラスを、引き渡しているはずです。

「非常に大きくて」なんて言っていないで、grepでもeclipseの参照でもいいので、追ってみましょう。
それもまた、勉強です。

評価

0

mioさんありがとうございます。


評価

0

解決 ということになってるみたいなので、余談としてでも。

>interfaceのメソッドをimplementしてないのに関わらず
と言われると、ちょっと??なんですけど・・。

クラスBにインターフェイスAのgetValueメソッドが実装されていないのに・・ということだと、それは実装(?)エラーでしょう。
クラスBがabstractなら、まだ実装されていなくても問題ないですけど。
(クラスBを継承してgetValueメソッドを実装しているクラスが何処かにあるのでしょう)

この辺りはmioさんも挙げられているEclipseとかを使えるのなら、階層ビューを利用したりするとインターフェイスAにぶら下がっているものが確認できたりするでしょう。


質問の主旨はクラスBの中のgetメソッドですよね。
(このとき"implement A"は外して考えてもよくて・・)

例えば何処かにインターフェイスAがimplementされた、例えばクラスCとか存在しているんでしょう。
(クラスB自身であったりもするのかも・・は挙げられたコードからはややこしくなりそうなので割愛するとして)

そのクラスCのオブジェクトとかはインターフェイスAがimplementされたものなので、B#getメソッドで受け取れます。
そしてa.getValue()はクラスCに実装されたgetValue()を呼ぶことになるので、別に何の不思議もなく呼べるということですね。

なので、質問の部分については別にエラーにはならない筈です。

しかし、クラスBが挙げられた通りのコード(getValueメソッドの実装がない)となっているのなら、"implement A"によりクラスBにgetValueメソッドを実装することが強要されられることになるので、"getメソッド内のa.getValue()とかではなく、クラスB自体が"実装(?)エラーとなる筈と思います。

この辺りはmioさんも言われていますけど、インターフェイスについてとかも一応復習とかはしておくのがいいのかも。


B#getメソッドに渡されるインターフェイスAを持つオブジェクトが何処で作られたものかは、同様にEclipseが使えるなら呼び出し階層ビューとかで探し出したりできるんでしょう。

mioさんも言われていますが、頑張ってクラスのツリーくらいは調べ上げた方がいいのかも知れませんね。
面倒でもそれが出せていたりすると、巨大でもコードを追うのは随分楽になるんじゃないのかな?と思ったりします。

というか・・そういうのって設計されたものがあったりしないんでしょうか・・。
(書いている人をあまり見ないのも確かだったり?するけど・・
でもそれは毎度火を噴いてるようなプロジェクトでの話で・・)

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。