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

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

ただいまの
回答率

91.24%

  • Java

    10904questions

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

  • キャスト

    17questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 138

publicstatic

score 4

前提・実現したいこと

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

エラーメッセージ

該当のソースコード

1.EmailListのclass

public class EmailList {
    String id;
    String name;
    String email;

    public EmailList(String id,String name,String email){
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public String toString(){
        return "[" + id + ", " + name + ", " + email + "]";
    }
}
2.emailObjectの内容
Map emailObject = new Map();
final String[][]EMAIL_LIST = {
                {"0101","丸野","maruno@abc.co.jp"}
                ,{"0201","山田","yamada@def.com"}
                ,{"0202","鈴木","suzuki@def.com"}
                ,{"0102","佐藤","sato@abc.co.jp"}};
        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]));
        }
3.問題の箇所

EmailList el = (EmailList)emailObject.get(id);

試したこと

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

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

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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

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

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

Map<String, EmailList> emailObject = new HashMap<String, EmailList>();

/* 中略 */

// ちゃんとEmailListで返ってくるので、キャスト不要
EmailList el = emailObject.get(id);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/24 12: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型のオブジェクトなのでキャストしないとメゾットが使えないという認識でよろしいでしょうか?

    キャンセル

  • 2017/12/24 15:06

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

    キャンセル

  • 2017/12/24 18:07

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

    キャンセル

+3

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/24 12:12

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

    キャンセル

  • 2017/12/25 00:09

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

    キャンセル

  • 2017/12/27 19:53

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

    キャンセル

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

ただいまの回答率

91.24%

関連した質問

同じタグがついた質問を見る

  • Java

    10904questions

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

  • キャスト

    17questions

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