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

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

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

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

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Q&A

解決済

2回答

757閲覧

classのキャストのイメージが理解できません。

publicstatic

総合スコア23

Java

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

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

0グッド

0クリップ

投稿2017/12/23 08:15

###前提・実現したいこと
double型をint型にキャストするときは
double a = 1.0;
int b = (int)a;
のようにdouble型を整数にして代入するということで理解できるのですが
classの場合
classA A = (classA)B;
の場合Bをどういう変換をしてAにしているのかその過程がわかりません。下の問題がわからず調べているうちに疑問になりました。イメージとしてわかりやすい方法がなにかあれば教えていただけないでしょか?よろしくお願いいたします。

エラーメッセージ

###該当のソースコード

java

11.EmailListのclass 2 3public class EmailList { 4 String id; 5 String name; 6 String email; 7 8 public EmailList(String id,String name,String email){ 9 this.id = id; 10 this.name = name; 11 this.email = email; 12 } 13 14 public String toString(){ 15 return "[" + id + ", " + name + ", " + email + "]"; 16 } 17} 182.emailObjectの内容 19Map emailObject = new Map(); 20final String[][]EMAIL_LIST = { 21 {"0101","丸野","maruno@abc.co.jp"} 22 ,{"0201","山田","yamada@def.com"} 23 ,{"0202","鈴木","suzuki@def.com"} 24 ,{"0102","佐藤","sato@abc.co.jp"}}; 25 for(int i=0;i<EMAIL_LIST.length;i++){ 26 emailObject.put(EMAIL_LIST[i][0],new EmailList(EMAIL_LIST[i][0],EMAIL_LIST[i][1],EMAIL_LIST[i][2])); 27 } 283.問題の箇所 29 30EmailList el = (EmailList)emailObject.get(id);

###試したこと
ソースコードは問題の一部で
1はキャストするclass
2はMapのemaliObjectの中に3つの値を4行分入れています。
3が問題でidをキーとして値を返しているのはわかるのですがEmailListでキャストしていることがどういう意味を持っているのかわかりません。
調べているとclassのキャストはスーパークラスとサブクラスのように同じフィールドとメゾットがないとできないとだけ理解しましたがemailObject.get(id)の部分はフィールドなのかメゾットなのかわかりません。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

ベストアンサー

Javaの場合、すべてのオブジェクトは基底クラスをたどるとObject型となっています。なので、Mapのようなコンテナは全データをObject型として扱って、取り出したときにオブジェクトの種類をキャストで読み替えるというような使い方をしていました。

なお、C++と異なり、Javaのオブジェクト型同士のキャストは自分で処理を決めることはできず、同じオブジェクトに付いた型だけ付け替える、というようなイメージです。

…ただ、Java 1.5ではジェネリクスといって、このような型変換を自動化する仕組みが登場していますので、コンテナ使用時の型キャストは不要となっています。

java

1Map<String, EmailList> emailObject = new HashMap<String, EmailList>(); 2 3/* 中略 */ 4 5// ちゃんとEmailListで返ってくるので、キャスト不要 6EmailList el = emailObject.get(id);

投稿2017/12/23 12:27

maisumakun

総合スコア145183

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

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

publicstatic

2017/12/24 03:46

迅速な回答ありがとうございます。 1 EmailList el = (EmailList)emailObject.get(id); 2 for(int i=0;i<EMAIL_LIST.length;i++){ emailObject.put(EMAIL_LIST[i][0],new EmailList(EMAIL_LIST[i][0],EMAIL_LIST[i][1],EMAIL_LIST[i][2])); } 1のemailObject.get(id)で返されるのが2の中のnew EmailList(EMAIL_LIST[i][0],EMAIL_LIST[i][1],EMAIL_LIST[i][2])というEmailListのインスタンスなのでキャストして代入できると思いました。しかしemailObject.get(id)で返されるのはあくまでmap型のオブジェクトなのでキャストしないとメゾットが使えないという認識でよろしいでしょうか?
maisumakun

2017/12/24 06:06

通常、Mapは汎用に作ってありますので、どんなクラスでも格納できるようにObject型で受け渡しします。
publicstatic

2017/12/24 09:07

object型にするとどのクラスでもキャスト可能になるのですね。object型についてもっと調べてみたいと思います。ありがとうございました。
guest

0

そのオブジェクトの扱い方を変えるとイメージしてください。

例えば「乗り物」というクラスがあり、それを継承して「自動車」や「バス」、「トラック」などのクラスをつくったとします。
「自動車」などのクラスからそれぞれのインスタンスを生成できますが、それを「乗り物」の変数に入れることができます。この時も暗黙的なキャスト(アップキャスト)が発生しますが、実体が変わるわけではないことを留意しておいてください。

ここで「自動車」のインスタンスが「乗り物」変数に入っているとします。この「乗り物」変数のメソッドを使って色々するわけですが、「乗り物」クラスで定義しているメソッドしか使うことができません。「自動車」にしかないメソッドを使うよう指示すると、「バス」などが入った場合に困ります。
「乗り物」に入った「自動車」を「自動車」として扱うためには「自動車」の変数に入れる必要があるため、キャストを使うことでそのオブジェクトの見方を変えるのです。これまで自動車の「乗り物」の特性部分しか見てなかったものを「自動車」の特性を見るようにするのです。

投稿2017/12/23 16:23

swordone

総合スコア20649

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

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

publicstatic

2017/12/24 03:12

迅速な回答ありがとうございます。式にすると 1.(乗り物)A = new (自動者)メゾットは乗り物部分のもののみ使用可能 2.(自動車)B =(自動車)A  という動作をしているということでよろしいでしょうか? 1は乗り物の型になっているので乗り物のメゾットのみ 2は自動車の型になっているので自動車とスーパークラスに該当する乗り物の両方のメゾットを使用できる。と理解しました。 この場合1の過程を通ることなく直接2の式にしたほうがいいと思うのですが、1の過程を通る利点というのは何かあるのでしょうか?
swordone

2017/12/24 15:09

その変数が「自動車」だけじゃなく「乗り物」全般を扱いたいという場合は、「自動車」の型では扱えないということになります。 実用的な話になると例示から外れますが、equals(Object)が該当します。あらゆるものと比較して同じか否かを判定したいので引数型はなんでもとれるObjectである必要があるのですが、内部的に同じかどうか比較するためにはObjectとしての情報では足りず、その型の情報が必要になります。
publicstatic

2017/12/27 10:53

返答ありがとうございます。object型について調べてみることにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問