博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从头认识java-13.9 隐式和显示的创建类型实例
阅读量:7072 次
发布时间:2019-06-28

本文共 2736 字,大约阅读时间需要 9 分钟。

对于上一章节擦除引起的问题与解决的方法有读者提出过于简单。这里解释一下:由于笔者本身也遇不到对应的问题。仅仅是凭空想像一些有可能的问题,基于水平有限,因此上一章节写的比較简单,欢迎广大读者踊跃提意见,我会尽量改进。

回归到这一章节,这里我们将讨论隐式和显示的创建类型实例。

1.隐式建类型实例

我们上一章节提到以下有问题的代码:

package com.ray.ch11;public class Test
{ 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
{ private Class
kind; public Test(Class
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
{ private Class
kind; public Test(Class
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.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
{ public static void main(String[] args) { new IntegerFactory().create(); }}interface IFactory
{ T create();}class IntegerFactory implements IFactory
{ @Override public Integer create() { return new Integer(0); }}

 

(2)通过模版方法设计模式来约束实现

package com.ray.ch11;public class Test
{ public static void main(String[] args) { new IntegerFactory().show(); }}abstract class AFactory
{ public final T obj; public AFactory() { obj = create(); } abstract public T create();}class IntegerFactory extends AFactory
{ @Override public Integer create() { return new Integer(0); } public void show() { System.out.println(obj.getClass().getName()); }}

总结:这一章节主要讲述隐式创建类型实例隐含的问题,以及如何通过 显示创建类型实例的解决方式。

 

这一章节就到这里,谢谢。

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

 

 

 

转载地址:http://rzkml.baihongyu.com/

你可能感兴趣的文章
实战1:创建Windows Server 2008域
查看>>
Windows 8实例教程系列 - 数据绑定高级实例
查看>>
批量查看mysql多从状态和修改多从主库指向
查看>>
Gartner:2016年十大信息安全技术(含解读)
查看>>
OSSIM系统用户审计
查看>>
如何使用Exchange邮件组仲裁
查看>>
使用Formik轻松开发更高质量的React表单(二)使用指南
查看>>
python写的部署windows下zabbix客户端脚本
查看>>
腾讯 vs 百度:两家互联网巨头对比
查看>>
数据中心的云计算之旅-【沈阳软件】2011年
查看>>
IOS7为什么遭吐槽?
查看>>
Android和.NET通用的AES算法
查看>>
Java那些事之磁盘操作
查看>>
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)...
查看>>
【学习】HTML5深入学习
查看>>
windows计数器和瓶颈
查看>>
浅谈VS编译自定义编译任务—MSBuild Task(csproject)
查看>>
推荐20个优秀的网页色彩搭配实例
查看>>
搜集点shell资料
查看>>
望江南
查看>>