歩いた自慢大会

教えてください。
下記のようなジェネリクスを使った構文があるのですが、
Car<toyota> t = new Car<toyota>();
そもそも基本的なことですが、
この場合のtoyotaというのは
toyotaというclassがあって
その中で定義されている変数だとかメソッド(?)もしくは
インスタンス化されたオブジェクトが
このCarというオブジェクトの中で使えるという
イメージでしょうか?
Carの中のtoyotaいまいちイメージができていなくて
申し訳ありません。

すみません。よろしくお願い致します。

A 回答 (3件)

型(type または class)から値(instance)を作成する際に、


型の構築子(constructor)に引数を指定して、値の挙動を変えることが出来ます。

同様に、

総称型(generic type)から通常の型(raw type)を作成する際に、
総称型に型引数(type parameter)を指定して、型の挙動を変えることが出来ます。

Car<Toyota> t = new Car<Toyota>() という記述ですが、
総称型 Car に型引数 Toyota を指定して通常の型 Car<Toyota> を作り、
型 Car<Toyota> の構築子に引数(この場合は無し)を指定して値を作り、
型 Car<Toyota> の変数に入れています。

総称型 Car において、型の挙動がどのように変わるのかは分かりませんが、
一般的には公開メソッドの型安全性を高めるために使われることが多い様です。
    • good
    • 1

> Carの中のtoyotaいまいちイメージができていなくて



ご質問の内容を拝見すると
「Car型のインスタンスの中にtoyota型のインスタンスが混ざり合っている」といったニュアンスを感じます。
もし間違っていたら、申し訳ありません、読み飛ばして下さい。



> Car<toyota> t = new Car<toyota>();

この記述は、Car型インスタンスtにおいて扱うデータ型がtoyota型だよということにすぎません。



例えばList<T>というクラスがあります。
このクラスは、扱う複数のデータを順番に並べて管理します。
そして、5番目のデータを取りだしたり、新しいデータを順番の最後に追加したり、管理しているデータの個数を取りだしたりします。
そしてこの段階ではデータとしてどの様なもの(型)を管理するのかが決められていません。

そこでインスタンスの宣言において
List<string>とすれば、順番に並べて管理するデータはstring型ですし
List<toyota>とすれば、順番に並べて管理するデータはtoyota型になります。
それだけのことですね。



おそらくCar型とかtoyota型というのは、ジェネリクスの説明の例えで概念的に登場したもので、具体的な機能は書かれていないのでイメージがし難いのだと思います。
漠然とした例えは理解の助けになることもありますが、却って阻害することもあります。
今回の様な場合は、実際に簡単なプログラムを書いて動作させてみた方が理解しやすいと思います。
    • good
    • 1

う~ん、ある程度型を特定したジェネリクス型なら


ある程度そういうことも出来ます。型を特定してなければ
Objectのメソッドくらいしか使えない。
いずれにしても、型パラメータの型が程度の差こそあれある程度
不祥のままCarをコーディングすることになるので
toyota型の全てのメソッドが使えるわけでは無いです。

ジェネリクスというのは、―群のクラス群に対して同じアルゴリズム
を適用するための仕組み です。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報