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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

5回答

7570閲覧

「ジェネリッククラス」って一体なんなんでしょうか?

mr0237

総合スコア164

Java

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2017/03/26 02:57

JAVAを勉強している者です。説明が下手ですいませんが、「ジェネリッククラス」って一体なんなんでしょうか?
私はまだ勉強不足だと思いますが、「ジェネリッククラス」というのは「ジェネリクス」のことではないんですか?違うんですか?
**わかりやすいような例や例えで教えてくれませんか?  **
できれば身近な例を挙げて教えてくれませんか?
よろしくお願いします。

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

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

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

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

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

guest

回答5

0

すいません、ジェネリッククラスについては認識不足でしたので、冒頭部分は取り消します。

「ジェネリッククラス」は誤った(少なくとも検索上位に来るほど一般的な呼称ではない)言葉で、「ジェネリクス」または「ジェネリックス」が正しいです。日本語では「総称型」とも呼ばれています。以下私の回答では「ジェネリクス」で統一させていただきます。

Javaのメソッドでは、引数の型や返り値の型を宣言しなければなりません。しかし、1種類ではなくいろいろな型を取らせたい場合があります。代表的な例はListです。
Stringを扱うList、Integerを扱うList、…と、時と場合によって何を入れるListを作りたいかはまちまちです。かといって、それ専用のクラスを作るというのも種類が増えすぎますし、そもそも型が違うだけでListがやりたいことは、要素を詰めたり出したりするだけで全く変わりがありません。

なら、あらゆる型を詰め込めるようにObject型で詰めればいいじゃないか…としていたのがジェネリクスの登場するJava1.5より前の話です。しかしObjectで詰めることで、出すときに元の型がわからなくなってしまい、キャスト時の安全が保障されないという難点がありました。
たとえるなら何でも詰められる4次元ポケットみたいなものがあったとして、便利だということで何でもかんでも詰め込みました。ところがそこから何かを取り出したときにわかるのは「それがモノである」というだけで、それが何なのか全くわからない状態になっている、というような状態です。

それを解消したのがジェネリクスです。例えば4次元ポケットを用意するときに、「これは文字列用!」というように、入れるものを限定するわけです。文字列以外のものを入れようとしても、「入れられないよ」と突っぱねられます。こうすることで、中に入っているのが文字列だけである、ということが保証されます。
文字列しか入っていないので、取り出すものも間違いなく文字列だ、ということができるわけです。

投稿2017/03/26 03:35

編集2017/03/26 04:13
swordone

総合スコア20651

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

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

KSwordOfHaste

2017/03/26 03:48 編集

ジェネリッククラスと聞いても違和感がなかったのですが間違った用語は使わないようにしないといけないですね。自分の用語には怪しいところがありそうです。参考にさせていただきます。 --- 気になったので調べてみました。OracleやMSDNのページで少なくとも英語ではgeneric classという単語を使っていますが、それをそのままカタカナでジェネリッククラスと呼ぶのが適切かどうかはまた別かも知れないなぁとも思いました。用語として変かどうかについては一応知っておきたいですね。
swordone

2017/03/26 04:11

私も回答してからほかの方の回答で「ジェネリッククラス」の説明をしているのを見て、 あ、あるんだ… と思った次第です…
KSwordOfHaste

2017/03/26 04:20

総称型が自分には無難かなぁ・・・google検索してみてそんなことを感じました。
haru666

2017/03/26 05:56

日本語の方が私は理解しにくいですが…総称型って言われたらむしろ頭にハテナが浮かびそうです。 総称リスト型、まあ、分かるといえば分かるんですが、コーディングする時の目的の出発点が逆だと思うんですよね。したい、から共用できる性質のものを作ったから総称できるんであって卵を鶏と呼んでいるような違和感が総称型にはあります。 ジェネリックの意味自体が共用であることを表しているので、ジェネリックプログラミング、メソッド、クラス、その単語自体は問題ないのではないでしょうか。総合すればジェネリクスなのでしょうが。 インライン関数を埋め込み関数といわれたら分かるか…?という疑問があります。
KSwordOfHaste

2017/03/26 06:06 編集

単に間違っていない用語といえるかというだけの話でした。確かに用語を知らないときに「総称型」と言われてイメージしやすいかというとあれですけどw; Intのリスト、Stringのリスト…色々な型のリストがありますがそれらを総称して表すList<T>という型が使えます。といわれれば「はぁそういうことですか」と思えなくもないと思います。苦しいかな?w;
haru666

2017/03/26 06:06

ああでも考えてみると卵は総称ですね。
haru666

2017/03/26 06:09

そうやって見ると総称感あるよなというのは私も感じました。 ちょうど今同じこと考えていました。 ただ、卵生、は共用…進化論から見れば共用した遺伝配列なのかもしれませんが、共用?応用した結果?とは見えないという感があるというんですかね。難しいですね。
guest

0

ベストアンサー

generics
ジェネリクス、総称性のことです。これはクラスに限らず、総称型を使うのこと、例えばメソッド単独でもありえます。
private int f<Type>(Type arg)

対して
generic class
ジェネリッククラス、総称クラスのことです。これは総称型を使ったクラスのことです。
class A<Type>

投稿2017/03/26 03:24

HogeAnimalLover

総合スコア4830

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

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

0

ジェネリクスとは何か?

「クラスやメソッドを定義する時に汎用的な型を示し、実際に利用する時に使用する型を代入すること」

具体的にはどんな風にするのか?

例1)ジェネリクスを使用して作ったクラス

class NewGen<T>{//<T>に任意の型が使用時に入る

T name;//T型の変数name

NewGen(T a){//T型の変数を引数に取るコンストラクタ
this.name=a;
}

T method(){//T型の内容を返すメソッド
return name;
}

}

使用時には

NewGen<Integer> a=new NewGen<Integer>(200);

Integer b=a.method();

のように使う

例2)ジェネリクスを使用して作ったメソッド

class NewGenMeth{

String name="mr0237";

<T> T method(T a){//T型の内容を返すメソッド <T>に任意の型が使用時に入る
return a+" is a question of "+name;
}

}

使用時には

NewGenMeth a=new NewGenMeth();

String s=a.<String>method("ジェネリクスとは何か");

のように使う

ジェネリクスクラスという概念が公式に認められているものかは謎のようですが、

ジェネリクスを用いる事のできる、ジェネリクスの使用に対応したクラス
というこてではないのでしょうか

それは何か?

ArrayList<String> a=new ArrayList<>();

ジェネリクスを用いることができます

ArrayListはジェネリクスクラスです

LinkedList<Integer> b=new LinkedList<>();

ジェネリクスを用いることができます

LinkedListもジェネリクスクラスです

このように続けて行くと、
ArrayList,CopyOnWriteArrayList,ArrayBlockingQueue,LinkedList,Vector,HashSet,LinkedHashSet,
TreeSet,CopyOnWriteArraySet,DelayQueue,PriorityQueue,PriorityBlockingQueue,LinkedBlockingQueue,ConcurrentLinkedQueue,HashMap,LinkedHashMap,ConcurrentHashMap,HashTable,TreeMap
などもジェネリクスクラスだと類推できます
上に記した 1)内のような自作ジェネリクスクラスもジェネリクスクラスに含まれるでしょう

投稿2017/03/26 04:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ジェネリッククラスとはList<T>のような型引数をもつ特定あるいは複数のクラスのことを指す言葉で、ジェネリクスというと「複数の型をひとまとめにして扱う(定義できる)機能全般」のことを指すと考えればよいと思います。

java

1class Math { 2 public static <T extends Comparable<T>> T max(T a, T b) { 3 if (a.compareTo(b) >= 0) 4 return a; 5 else 6 return b; 7 } 8}

例えば上の例でMathはジェネリッククラスではありませんが、maxメソッドは型引数を持っておりComparableをサポートした型、例えばNumberやStringといった「大小を比較できる型」なら何を指定しても呼び出すことができるメソッドになっています。

このメソッドはもちろんクラスではないので「ジェネリッククラス」とはいいません。しかし「複数の型をひとまとめにして扱う(定義できる)機能の一つ」なので「ジェネリクス」とは呼べる・・・そういう感じでしょうか?

この説明は自分が普段そう捉えているということを述べたものですが用語の認識間違いなどあればご指摘いただければ幸いです。

投稿2017/03/26 03:34

編集2017/03/26 03:35
KSwordOfHaste

総合スコア18394

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

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

0

「ジェネリクス」は「汎用」というような訳が私にはしっくりきます。

機能としてはList<String>のように「型を指定して宣言できるクラス」というような説明になりますが、ここでポイントとなるのは**「List」はStringだけでなくIntegerでもCharactorでも使える=汎用である**ということです。

「汎用」という概念を理解するためには「汎用でない場合に何が問題なのか」ということを考えると分かりやすいのですが、たとえばStringを扱うListは「stringList」、Integerを扱うListはintegerList・・・というように使う型によって利用できる配列クラスが決まっていたとします。
ただその場合、自分でクラスを作った場合、そのクラスを格納するようなクラスは自分で作ったりする必要があります。
それはそれでプログラミングはできるのですが、できれば一律のクラスで、「格納できる要素の型」を指定できたほうが便利だと思いませんか。

というわけでStringでもIntegerでも自作クラスでも格納することができるような「汎用クラス」という考え方が必要とされます。
これがジェネリクスという考え方です。
で、それを実現するために用意されたのが「ジェネリッククラス」List等のクラスというわけです。ただし「ジェネリッククラス」という呼び方は通称ではないかと思います。

そう考えると、途端に「List<String>」というような宣言方法が便利だなと思えるのではないかと思います。最初に宣言しておけば、どんな型だって自由自在に格納できて、Listの持つlength等のプロパティやメソッドも使い放題なわけです。

投稿2017/03/26 06:40

編集2017/03/26 06:50
akabee

総合スコア1947

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問