Java汎用とタイプ消去

1284 ワード

簡単なJavaの一般的な例を次に示します.
public static void main(String[] args) {
	Map map = new HashMap();
	map.put("hello", "  ");
	System.out.println(map.get("hello"));
}

汎用消去後:
public static void main(String[] args) {
	Map map = new HashMap();
	map.put("hello", "  ");
	System.out.println((String) map.get("hello"));
}

//////
まず問題コードを見てみましょう.
public class Manipulation {
	public static void main(String[] args) {
		HasF hf = new HasF();
		Manipulator m = new Manipulator<>(hf);
		m.manipulate();
	}
}

class HasF {
	public void f() {
		System.out.println("HasF.f()");
	}
}

class Manipulator {
	private T obj;
	public Manipulator(T x) {
		obj = x;
	}
	public void manipulate() {
		obj.f(); /*            f()    */
	}
}

Manipulatorクラスでは、Javaコンパイラはobjオブジェクトがf()メソッドを持っていることを知ることができず、汎用クラス境界を与えなければならず、コンパイラがこの境界に従うタイプしか受信できないことを通知します.ここではextendsキーワードを再利用しました.境界があるため、次のコードをコンパイルできます.
class Manipulator {
	private T obj;
	public Manipulator(T x) {
		obj = x;
	}
	public void manipulate() {
		obj.f(); /*         */
	}
}