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

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

ただいまの
回答率

90.33%

  • Java

    14461questions

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

  • JavaFX

    410questions

    JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

総称型って何?

解決済

回答 3

投稿

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

mr0237

score 143

JAVAを勉強している者です。説明が下手ですいませんが、この質問(「ジェネリッククラス」って一体なんなんでしょうか? )

generic class 
ジェネリッククラス、総称クラスのことです。これは総称型を使ったクラスのことです。 

と出てきたんですが、「総称型」って何なんでしょうか?

ネットをみても「さまざまな型に対応するために、型をパラメータとして与えて、その型に対応したクラスや関数を生成するもの機能」とか書いてあるんですが、なんなのかよくわかりません。 

わかりやすいような例や例えで教えてくれませんか?

よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2017/03/28 23:46

    私その前の質問で書いたつもりなんですがねぇ

    キャンセル

回答 3

checkベストアンサー

+2

工場で流れ作業をしているとしましょう。
いくつかの箱に、部品や工具を入れることになっていたとします。

「ネジ用」「ドライバー用」「クギ用」・・・など色々な箱があったとします。

ある日、ネジ用の箱が足りなくなり、代わりに空いていたクギ用の箱にネジを入れようとしたのですが、「それはクギ用だから駄目だ」ということになったとします。それが工場のルールであれば仕方のないことではありますが、それによって流れ作業が止まってしまっては非効率です。

箱は箱なわけです。
例えば、別に箱をそれぞれ最初から「○○用」なんて決めてしまわずに、使うときに「これはネジ用にする」などと貼り札をして使ったほうが便利だと思いませんか?

プログラミングでも変数を箱に例えることがありますが、上記の工場の例のような問題が起こっていたことがあるのです。しかも自分で作った部品の場合、自分で箱を用意しなければなりませんでした。
それを解決するために、「総称型」という箱を言語の開発者が提供してくれたわけです。中に何を入れようが、「これは○○型です」と最初に宣言(型をパラメータとして与える)すれば、総称型のクラスはどんなものも受け入れることができるのです。

※その性質から、私は「総称型」よりも「汎用型」と略すほうがしっくりきます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

例えば、メソッドaddで引数に入れた変数を一つずつ格納し、メソッドallで引数に入れた内容と結合した文章をランダム順で表示する機能を持つクラスを作るとすると

ジェネリクスを用いて以下のように作れます

class Shuff<T>
がジェネリクスを作って作られたクラスで
public <E> void all(E c){
がジェネリクスを使って作られたメソッドです

変数T,Eは後から決める事ができます

import java.util.*;
public class Samp{

public static void main(String[] args){

Shuff<Double> s=new Shuff<>();

s.add(1.41421356);
s.add(2.2360679);
s.add(1.7320508);
s.add(3.1415);

s.all("夢");

Shuff<String> s2=new Shuff<>();
s2.add("r023");
s2.add("r023-2");
s2.add("r023-3");
s2.add("r023-4");

s2.all(3.14);

}

}



class Shuff<T>{

private ArrayList<T> b=new ArrayList<>();

public void add(T a){

b.add(a);

}

public <E> void all(E c){

Collections.shuffle(b);

for(T a:b){
System.out.println(a+"と"+c+"を加えた文");
}

}


}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

前回に引き続き、Listで説明します。
このドキュメント内にある<E>のように、<>で囲まれたものが総称型と呼ばれるものです。
Listに絞ってもまだメソッドが多くて目移りしますが、とりあえず基本的な機能である、

に絞って説明していきます。

前回の説明のように、Listはいろいろな型を扱わせたいです。その目的を満たすため、つまりListはどんな型も受け入れられるようにするため、addメソッドではObject型を引数の型にしたとします。
しかしObjectで受け取ったがゆえに、内部で保持するためにもObject型で持っていなければいけません。
そうなるとgetで取り出すときに困ります。もともとどういう型を入れたかという情報は要素を詰めた段階で消えてしまったので、確実に取り出せる型であるObjectとして取り出すほかありません。つまりgetの返り値はObjectという形にしないといけません。

しかし、Listの用途として、1つのListで全くかかわりのない複数の型を扱うということはほとんどありません。文字列なら文字列、整数なら整数と決まったものをしまうのが普通ですよね?
そのような用途で使うはずのListなのに、取り出す型が決められずObjectというのは不便です。
取り出すたびに目的の型にキャストする必要もありますし、また何らかのメソッドの返り値としてListが来た場合、そのListが何を扱ったものなのかの確定情報がありません。結果、型安全性が崩れます。
結果、何でも入れられるようにとObject型を引数にとった結果、逆に何でもかんでも入れられるせいでObject型でしか返せないというデメリットが目立つようになります。

であれば、Listを用意する際に最初から文字列用と決めておけばいいのです。そのための仕組みが総称型です。
Listの型を変数の型として宣言する際、<>の中に扱う型を宣言します。

List<String> list = new ArrayList<String>();


こうすることで、この変数listの型Listの<E>に該当する型がStringということになり、この型の持つメソッドの引数型や返り値型で使われているEもすべてStringとして扱えます。
つまり、addで要素を詰める際も(引数型がStringという扱いになるため)String型だけ受け付け(それ以外は「引数の型が合わない」コンパイルエラーになるためミスが見つかりやすい)、getで取り出す際も(返り値型がStringという扱いになるため)キャストする必要もありません。

この機能が、<>の中の型を書き換えるだけで参照型すべてに適用できるため、非常に汎用性が高くなるのです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Java

    14461questions

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

  • JavaFX

    410questions

    JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。