あるinterface(Interface)をimplementsしたクラス(Childクラス)を作成し、
Java
1Interface child = new Child(); 2System.out.println(child instanceof ○○); 3```として○○のところにInterface,Childのどちらを入力してもtrueが返ってきます。 4 5この型が両立している(?)ような状態はどのような仕組みの下で成り立っているのでしょうか? 6また、宣言した型と初期化した中身の型が異なっている状態がどのような仕組み(技術・設計)なのかを教えていただきたいです。 7 8修正依頼を受け、質問内容を少し変更いたしました。また再度質問タイトルを編集しました。
一般的な説明はできても、あなたに通じる説明ができるかどうかはあなた次第だと思います。
「どうして不可能だと思うのか」を掘り下げて書いてみてはどうでしょうか。
でなければ、回答は一般人に向けたものになり、その辺にあふれている解説と何ら変わりないものとなります。短時間で書かれるということで、回答の方が不利とも言えます。
> 宣言する際の型(ここではInterfaceにあたる)と中身の型(Child)が異なっているのがなぜ可能なのか
可能が何にかかっているか、わからないんだけど・・・記述が可能?(コンパイル可能)ということ?
それとも、
宣言する際の型(ここではInterfaceにあたる)と中身の型(Child)が異なっているのがなぜtrueになるのか
ということ?
質問のタイトル”ポリモーフィズムはなぜ可能なのか”と相まって、実現可能な技術的な話(仕組み)なのか、
javaの言語仕様の話を知りたいのか、ちょっとわからないです。
何故その機能を実現できるのかと言えば、その方法の一端としてC++で使われる仮想関数テーブル(vtable)について見てみると質問者さんの疑問の一部が解消できるかもしれない、と思いました。
質問者さんが注目しているクラスやインターフェースよりはメソッド(C++で言うメンバー関数)の方に重きを置いていますが。
[仮想関数テーブル - Wikipedia](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB)
[Javaにおけるメソッド呼出しの仕組み] JVMでもvtable相当のものを使っているようです。(https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-SO17-MethodInvoc.pdf)
※メソッドではなく、あくまで「クラス」全体について質問をされているのですよね?
dodox86さん
メソッドではなくクラスについて質問しています。
すみません、何に対する修正依頼かがわからないため、質問内容は変更しないでおきます。
質問のタイトルが「ポリモーフィズムはなぜ可能なのか」となっていますが、ポリモーフィズムはざっくり言って"メソッド呼び出しを動的に決定すること"を指します。 momon-gaさんの「質問のタイトル”ポリモーフィズムはなぜ可能なのか”と相まって(略)ちょっとわからないです。」という指摘、dodox86さんの情報もそれに起因しているように見えます。
つまり質問本文にポリモーフィズムが具体的に登場していないにも関わらず、タイトルにポリモーフィズムが登場しているせいで回答者側が混乱しています。
dodox86さんの情報は「宣言した型と初期化した中身の型が異なっている状態がどのような仕組みなのか」という質問に対する答えの一部だと(dodox86さんだけではなく私も)間違いなくそう思います。
("答えの一部"なのは質問タイトルが「ポリモーフィズムはなぜ可能なのか」であるせいです。その質問に回答しようとした時、その中のポリモーフィズムに関係がありそうな部分をdodox86さんは書いているのです)
それを見て「メソッドではなくクラスについて質問しています。」というコメントが出ると言うことは、質問者さんの聞きたいことは十分にここに書かれていないということが想像できます。
上のコメントを見るかぎり、「宣言した型と初期化した中身の型が異なっている状態がどのような仕組みなのか」という質問文に対して、ここの回答者が想像可能な質問と質問者さんが考えていることが、少なからず食い違っているようです。
(dodox86さんはある程度それを察していて、だから回答ではなくてこの欄に情報を書いて、確認しているのでしょう)
quiquiさん
ありがとうございます。質問タイトルが内容と少しズレていたようなので、変更しました。
宣言した型と中身は異なってないです。そのインターフェースを持つオブジェクトしかその変数に入れられないので。
インターフェースはそれを持つオブジェクトの「側面」と考えたらわかりやすいですか?
Interface インターフェースは Child の側面であるので、child もその側面を持ちます。
あなただって、社会人の側面を求められる時は社会人として振る舞い、家族の側面を求められる時は家族として振る舞うでしょう?
quiquiさん、フォローいただきましてどうもありがとうございました。私の本欄でのコメントの意図は、全くその通りです。
ひとつ思いついたことがあるのですが、「変数」という概念を学習する仮定で「箱」を例えにした説明を見て、その比喩で捉えているのではないでしょうか?