質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

1046閲覧

宣言した型と中身の型が異なるときの仕組み

a_boy

総合スコア54

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

3クリップ

投稿2020/05/03 09:05

編集2020/05/03 23:57

あるinterface(Interface)をimplementsしたクラス(Childクラス)を作成し、

Java

1Interface child = new Child(); 2System.out.println(child instanceof ○○); 3```として○○のところにInterface,Childのどちらを入力してもtrueが返ってきます。 4 5この型が両立している(?)ような状態はどのような仕組みの下で成り立っているのでしょうか? 6また、宣言した型と初期化した中身の型が異なっている状態がどのような仕組み(技術・設計)なのかを教えていただきたいです。 7 8修正依頼を受け、質問内容を少し変更いたしました。また再度質問タイトルを編集しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/05/03 09:27

一般的な説明はできても、あなたに通じる説明ができるかどうかはあなた次第だと思います。 「どうして不可能だと思うのか」を掘り下げて書いてみてはどうでしょうか。 でなければ、回答は一般人に向けたものになり、その辺にあふれている解説と何ら変わりないものとなります。短時間で書かれるということで、回答の方が不利とも言えます。
momon-ga

2020/05/03 11:07

> 宣言する際の型(ここではInterfaceにあたる)と中身の型(Child)が異なっているのがなぜ可能なのか 可能が何にかかっているか、わからないんだけど・・・記述が可能?(コンパイル可能)ということ? それとも、 宣言する際の型(ここではInterfaceにあたる)と中身の型(Child)が異なっているのがなぜtrueになるのか ということ? 質問のタイトル”ポリモーフィズムはなぜ可能なのか”と相まって、実現可能な技術的な話(仕組み)なのか、 javaの言語仕様の話を知りたいのか、ちょっとわからないです。
dodox86

2020/05/03 16:18 編集

何故その機能を実現できるのかと言えば、その方法の一端として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) ※メソッドではなく、あくまで「クラス」全体について質問をされているのですよね?
a_boy

2020/05/03 22:37 編集

dodox86さん メソッドではなくクラスについて質問しています。 すみません、何に対する修正依頼かがわからないため、質問内容は変更しないでおきます。
quickquip

2020/05/03 23:12 編集

質問のタイトルが「ポリモーフィズムはなぜ可能なのか」となっていますが、ポリモーフィズムはざっくり言って"メソッド呼び出しを動的に決定すること"を指します。 momon-gaさんの「質問のタイトル”ポリモーフィズムはなぜ可能なのか”と相まって(略)ちょっとわからないです。」という指摘、dodox86さんの情報もそれに起因しているように見えます。 つまり質問本文にポリモーフィズムが具体的に登場していないにも関わらず、タイトルにポリモーフィズムが登場しているせいで回答者側が混乱しています。 dodox86さんの情報は「宣言した型と初期化した中身の型が異なっている状態がどのような仕組みなのか」という質問に対する答えの一部だと(dodox86さんだけではなく私も)間違いなくそう思います。 ("答えの一部"なのは質問タイトルが「ポリモーフィズムはなぜ可能なのか」であるせいです。その質問に回答しようとした時、その中のポリモーフィズムに関係がありそうな部分をdodox86さんは書いているのです) それを見て「メソッドではなくクラスについて質問しています。」というコメントが出ると言うことは、質問者さんの聞きたいことは十分にここに書かれていないということが想像できます。 上のコメントを見るかぎり、「宣言した型と初期化した中身の型が異なっている状態がどのような仕組みなのか」という質問文に対して、ここの回答者が想像可能な質問と質問者さんが考えていることが、少なからず食い違っているようです。 (dodox86さんはある程度それを察していて、だから回答ではなくてこの欄に情報を書いて、確認しているのでしょう)
a_boy

2020/05/04 00:00

quiquiさん ありがとうございます。質問タイトルが内容と少しズレていたようなので、変更しました。
Zuishin

2020/05/04 00:10

宣言した型と中身は異なってないです。そのインターフェースを持つオブジェクトしかその変数に入れられないので。 インターフェースはそれを持つオブジェクトの「側面」と考えたらわかりやすいですか? Interface インターフェースは Child の側面であるので、child もその側面を持ちます。 あなただって、社会人の側面を求められる時は社会人として振る舞い、家族の側面を求められる時は家族として振る舞うでしょう?
dodox86

2020/05/04 00:29

quiquiさん、フォローいただきましてどうもありがとうございました。私の本欄でのコメントの意図は、全くその通りです。
quickquip

2020/05/04 12:19

ひとつ思いついたことがあるのですが、「変数」という概念を学習する仮定で「箱」を例えにした説明を見て、その比喩で捉えているのではないでしょうか?
guest

回答1

0

結局のところ、コンパイラが問題にしたいのは「その変数が何のメソッドやフィールドを持っているかを判断できるか」という点です。「型」はそのような特定のメソッド・フィールド群を持っている「集合」と考えるとわかりやすいかもしれません。この場合、Interfaceという集合の中に、Childという集合が含まれている関係になります。Childとして生成した変数childは、Childとして扱うこともでき、Interfaceとして扱うこともできます。
イメージ説明

投稿2020/05/03 09:26

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問