JAVAを勉強している者です。説明が下手ですいませんが、「ジェネリッククラス」って一体なんなんでしょうか?
私はまだ勉強不足だと思いますが、「ジェネリッククラス」というのは「ジェネリクス」のことではないんですか?違うんですか?
**わかりやすいような例や例えで教えてくれませんか? **
できれば身近な例を挙げて教えてくれませんか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア20651
0
ベストアンサー
generics
ジェネリクス、総称性のことです。これはクラスに限らず、総称型を使うのこと、例えばメソッド単独でもありえます。
private int f<Type>(Type arg)
対して
generic class
ジェネリッククラス、総称クラスのことです。これは総称型を使ったクラスのことです。
class A<Type>
投稿2017/03/26 03:24
総合スコア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総合スコア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総合スコア1947
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/26 03:48 編集
2017/03/26 04:11
2017/03/26 04:20
2017/03/26 05:56
2017/03/26 06:06 編集
2017/03/26 06:06
2017/03/26 06:09
2017/03/26 06:56