從頭認識java-13.9 隱式和顯示的創建類型實例
阿新 • • 發佈:2017-07-30
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 隱式和顯示的創建類型實例