对于上一章节擦除引起的问题与解决办法有读者提出过于简单,这里解释一下:因为笔者本身也遇不到相应的问题,只是凭空想像一些有可能的问题,基于水平有限,因此上一章节写的比较简单,欢迎广大读者踊跃提意见,我会尽量改进。
回归到这一章节,这里我们将讨论隐式和显示的创建类型实例。
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());
}
}
总结:这一章节主要讲述隐式创建类型实例隐含的问题,以及怎样通过 显示创建类型实例的解决方案。
这一章节就到这里,谢谢。
-----------------------------------