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

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

ただいまの
回答率

90.52%

  • Java

    13753questions

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

  • オブジェクト指向

    284questions

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

  • オブジェクト

    91questions

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

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

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 1,015

mr0237

score 143

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

+4

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/26 12:40 編集

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

    キャンセル

  • 2017/03/26 13:11

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

    キャンセル

  • 2017/03/26 13:20

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

    キャンセル

  • 2017/03/26 14:56

    日本語の方が私は理解しにくいですが…総称型って言われたらむしろ頭にハテナが浮かびそうです。

    総称リスト型、まあ、分かるといえば分かるんですが、コーディングする時の目的の出発点が逆だと思うんですよね。したい、から共用できる性質のものを作ったから総称できるんであって卵を鶏と呼んでいるような違和感が総称型にはあります。

    ジェネリックの意味自体が共用であることを表しているので、ジェネリックプログラミング、メソッド、クラス、その単語自体は問題ないのではないでしょうか。総合すればジェネリクスなのでしょうが。

    インライン関数を埋め込み関数といわれたら分かるか…?という疑問があります。

    キャンセル

  • 2017/03/26 15:05 編集

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

    キャンセル

  • 2017/03/26 15:06

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

    キャンセル

  • 2017/03/26 15:09

    そうやって見ると総称感あるよなというのは私も感じました。
    ちょうど今同じこと考えていました。

    ただ、卵生、は共用…進化論から見れば共用した遺伝配列なのかもしれませんが、共用?応用した結果?とは見えないという感があるというんですかね。難しいですね。

    キャンセル

  • 2017/03/26 15:56

    この辺りの用語や概念はプログラミング言語によって少し異なるところがありますが、Javaでは少なくとも公式の仕様で「Generic Class」という言葉が使われている以上、「ジェネリッククラス」は誤ってはいないですね。
    http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.2

    キャンセル

checkベストアンサー

+2

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

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

class Math {
  public static <T extends Comparable<T>> T max(T a, T b) {
    if (a.compareTo(b) >= 0)
      return a;
    else
      return b;
  }
}

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

ジェネリクスとは何か?

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

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

例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)内のような自作ジェネリクスクラスもジェネリクスクラスに含まれるでしょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Java

    13753questions

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

  • オブジェクト指向

    284questions

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

  • オブジェクト

    91questions

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