Java汎用型(一)--汎用型と原生態型を深く理解する

1732 ワード

Java1.5汎用型を導入した後、プログラムの安全性に新たな保障を加え、実行時のタイプエラーが発生する可能性を減らした.この文章は汎用型の基本操作を述べるのではなく、汎用型の処理を行う際に遭遇する可能性のある少し複雑な問題を理解しなければならない.最初の文章では、主にいくつかの汎型と原生態型の関係問題を理解した.
原生態タイプ(raw type)とは、タイプ情報を持たない「汎用」であり、例えばListのListに対して原生態タイプである.実際に原生態系タイプのListとJDK 1.5以前のバージョンは同じです.
明らかに得られる結論は原生態型が安全ではないことであり、例証は私にも与えられていない.ここではいくつかの汎型のいくつかの特徴と原生態型とのつながりしか言えない.
1.無制限のワイルドカードタイプ
汎用型では、リストのような無制限のワイルドカードタイプがあります.ここの「?」このリストの要素に制限がないか、まったく関心がないことを意味します.利便性を提供するとともに、リストのような無制限ワイルドカードタイプの汎用型を使用することにも大きな制限があります.要素を追加することはできません.
例:
	public void testMethod(Set<?> set){
		set.add("e");
	}

コンパイルには合格しません.このようにすることで、汎用的なタイプ制限を破壊しやすくなるからです.
ただし、例外もありnullは挿入可能です.
2.汎用情報の運転時消去
Javaの汎用型には、その汎用型情報が実行時に消去されるという特徴があります.つまり、コンパイル期間中にのみ汎用型が機能し、実際に実行されるときにはListとListにも違いはありませんが、これで十分です.
汎型のこの特徴のため、汎型は原生態型と2つのつながりがある.
(1)類の字面量は汎用型ではなく原生態型のみを用いる.
例えば、List.class,Map.class.リストを見たことがないかもしれませんclassの書き方ですね?これは合法的ではないからです.
(2)instanceofオペレータは元の生態タイプに従うしかない.
たとえば、次の方法を書きます.
	public static void testMethod(Collection<?> collection) {
		if (collection instanceof Set) {
			Set<?> s = (Set<?>) collection;
			for (Object e : s) {
				System.out.println(e);
			}
		}
	}

	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("1");
		set.add("2");
		set.add("3");
		set.add("4");
		set.add("5");
		testMethod(set);
	}

ここでinstancdofの後に続くのが原生態型であり,タイプが決定されると対応する汎用型に変換される.