1. 程式人生 > >從頭認識java-13.9 隱式和顯示的創建類型實例

從頭認識java-13.9 隱式和顯示的創建類型實例

imp otto rri show ktr exceptio oid text pac

對於上一章節擦除引起的問題與解決的方法有讀者提出過於簡單。這裏解釋一下:由於筆者本身也遇不到對應的問題。僅僅是憑空想像一些有可能的問題,基於水平有限,因此上一章節寫的比較簡單,歡迎廣大讀者踴躍提意見,我會盡量改進。

回歸到這一章節,這裏我們將討論隱式和顯示的創建類型實例。

1.隱式建類型實例

我們上一章節提到以下有問題的代碼:

package com.ray.ch11;


public class Test<T> {
	public void test(Object object){
//		System.out.println(object instanceof T);//error
//		System.out.println(new T());//error
//		System.out.println(new T[10]);//error
		System.out.println((T)object );//waring
	}
}


解決辦法就是以下的代碼:

package com.ray.ch11;

import java.lang.reflect.Array;

public class Test<T> {
	private Class<T> kind;

	public Test(Class<T> t) {
		kind = t;
	}

	public void test(Object object) {
		System.out.println(kind.isInstance(object));
		try {
			System.out.println(kind.newInstance());
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		System.out.println(Array.newInstance(kind, 10));
		System.out.println((T) object);// waring
	}
}


可是,表面上沒有太大的問題,由於我們是基於這個類有默認的構造器,我們來看看以下的代碼:

package com.ray.ch11;

public class Test<T> {
	private Class<T> kind;

	public Test(Class<T> t) {
		kind = t;
	}

	public void test() {
		try {
			System.out.println(kind.newInstance());
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new Test<Integer>(Integer.class).test();
	}
}

輸出:

java.lang.InstantiationException: java.lang.Integer
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at com.ray.ch11.Test.test(Test.java:12)
at com.ray.ch11.Test.main(Test.java:21)

我們降低了一些代碼,可是主體還留著。然後我們在裏面放上Integer這個類,我們能夠從輸出那裏看見,直接報錯。原因是Integer沒有默認的構造函數。

因為上面出現的問題,因此我們推薦以下顯示創建類型對象的方式。

2.顯示的創建類型實例

(1)利用工廠對象來約束實現

package com.ray.ch11;

public class Test<T> {

	public static void main(String[] args) {
		new IntegerFactory().create();
	}
}

interface IFactory<T> {
	T create();
}

class IntegerFactory implements IFactory<Integer> {
	@Override
	public Integer create() {
		return new Integer(0);
	}
}


(2)通過模版方法設計模式來約束實現

package com.ray.ch11;

public class Test<T> {

	public static void main(String[] args) {
		new IntegerFactory().show();
	}
}

abstract class AFactory<T> {
	public final T obj;

	public AFactory() {
		obj = create();
	}

	abstract public T create();
}

class IntegerFactory extends AFactory<Integer> {

	@Override
	public Integer create() {
		return new Integer(0);
	}

	public void show() {
		System.out.println(obj.getClass().getName());
	}
}


總結:這一章節主要講述隱式創建類型實例隱含的問題,以及如何通過 顯示創建類型實例的解決方式。

這一章節就到這裏,謝謝。

-----------------------------------

文件夾

從頭認識java-13.9 隱式和顯示的創建類型實例