忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/04/30 18:08 |
ジェネリクス
http://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%83%83%E3%82%AF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
> ジェネリック(総称あるいは汎用)プログラミング (generic programming)はデータ形式に依存しないコンピュータプログラミング方式。

これで意味がわかるやつはいるのか。
他のサイトを見てみても、

http://www.techscore.com/tech/Java/JavaSE/JavaLanguage/1/
> ジェネリクスとは、「総称性(Genericity)」「ジェネリック・プログラミング」とも呼ばれるプログラミング技法で、オブジェクト指向とは異なるパラダイムからきたものです。データの型に束縛されず、型そのものをパラメータ化して扱うことができます。

http://ufcpp.net/study/csharp/sp2_generics.html
> ジェネリックス(generics:総称性)、 あるいは、総称的プログラミング(generic programming)とも呼ばれますが、 この機能は、 さまざまな型に対応するために、型をパラメータとして与えて、その型に対応したクラスや関数を生成するもの機能です。

http://d.hatena.ne.jp/Nagise/20101105/1288938415
> ジェネリクスでは、「型」を変数にした「型変数」というものを取り扱う。

http://www.sophia-it.com/content/GENERICS
> C++言語のテンプレートに相当するもので、実行側コードからクラスの因数の型を指定することが可能となっている。

http://www.ne.jp/asahi/hishidama/home/tech/java/generics.html
> 総称型(ジェネリック・ジェネリクス)は、C++のテンプレート(template)と見た目はそっくりの機能。

とお前ら何言ってるんだ的解説ばっかりですし。
C++とか知らんがな。

正直いまだによくわかんないんですが、使用する側から引数の型を指定できるクラス・メソッドってことでいいんですかね。
とりあえず適当にクラスを作ってみます。
public class HogeClass {
	private Object value= null;
	public void setValue(Object value) {
		this.value = value;
	}
	public Object getIntegerValue() {
		return value;
	}
}
単にObjectを突っ込んで取り出すだけというクラスです。
これを使うときは、
	HogeClass.setValue("string");
	String value = (String)HogeClass.getValue();
と毎回受け取り側でキャストしてやらないといけません。
	HogeClass.setValue("string");
	Integer value = (Integer)HogeClass.getValue();
と、うっかりStringを突っ込んでIntegerで受け取ろうとすると実行時エラーになってしまいます。
文法的には正しいため、困ったことにコンパイルは通ってしまいます。
このような面倒を省くため、投入できるクラスを制限しましょう。
public class HogeClass {

	private Integer integerValue= null;
	private String StringValue= null;

	public void setValue(Integer value) {
		this.integerValue = value;
	}
	public void setValue(String value) {
		this.StringValue = value;
	}

	public Integer getIntegerValue() {
		return integerValue;
	}
	public String getStringValue() {
		return StringValue;
	}
}
型は限定できるようになりましたが、対応できる型を追加する度にメソッドを記述しなくてはならなくて大変です。
もっと簡単に書きたいということでジェネリックです。
public class HogeClass<T> {
	private T value= null;
	public void setValue(T value) {
		this.value = value;
	}
	public T getValue() {
		return value;
	}
}
Tという謎の型が追加されています。
これは型引数というもので、別にどんな文字でもいいのですがEとかKとかVとか大文字一文字(+数値)で表すのが通例になってるみたいです。
この謎の型引数の具体的な値はHogeClassを使用するときにコンストラクタで指定します。
	HogeClass<String> hoge = new HogeClass<String>();
	hoge.setValue("aaaa");
	String tmp = hoge.getValue();
型引数として<String>を指定しました。
これによって謎だったT型にString型が当て込まれ、以後全てのTはStringとして扱われます。
	HogeClass<String> hoge = new HogeClass<String>();
	Integer tmp = hoge.getValue();
と書いた場合、HogeClass.getValue()の返り値の型TはStringであるため、コンパイルエラーになります。

ジェネリックを使うことで、これまでは実行するまでわからなかったエラーをコンパイル時点で検出することができるようになりました。
めでたし。

という理解でいいんですかね?
PR


2011/12/26 22:47 | Comments(0) | TrackBack(0) | Java

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Minecraft 1.8.1 IndustrialCraft2 アドオン紹介 Advanced Generatorsその5 木ガスで燃料を作る | HOME | 買ったものリスト 2011/12/25>>
忍者ブログ[PR]