从头认识java-13.9 隐式和显示的创建类型实例
2024-10-19 03:39:40
对于上一章节擦除引起的问题与解决的方法有读者提出过于简单。这里解释一下:由于笔者本身也遇不到对应的问题。仅仅是凭空想像一些有可能的问题,基于水平有限,因此上一章节写的比較简单,欢迎广大读者踊跃提意见,我会尽量改进。
回归到这一章节,这里我们将讨论隐式和显示的创建类型实例。
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());
}
}
总结:这一章节主要讲述隐式创建类型实例隐含的问题,以及如何通过 显示创建类型实例的解决方式。
这一章节就到这里,谢谢。
-----------------------------------
最新文章
- 计算程序总行数的Python代码
- 模具厂MES项目介绍
- 编译系统中BNF: Backus-Naur Form
- 解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
- Oracle数据库中序列用法讲解
- MAC下搭建web开发环境
- Java Sleep() 与 Wait()的机制原理与区别
- 兼容PHP和Java的des加密解密代码分享
- Android上使用OpenGLES2.0显示YUV数据
- php编程提高执行效率技巧
- DOM范围
- 防止html5的video标签在iphone中自动全屏
- MySQL 8.0 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
- MapReduce编程:数字排序
- presto 函数中使用子查询
- JavaWeb基础-Jsp的请求与响应
- 在typeScript+vue项目中使用ref
- macOS下appstore提示未能完成该操作的解决办法
- 《Android高级进阶》读书笔记
- 源码的excel导入导出
热门文章
- Bitcoin 比特币, LTC(litecoin)莱特币,
- [Android UI] Service里面启动Activity和Alertdialog
- [原创]用逻辑嗅探破解接触式IC卡口令
- 纯C实现面向对象
- linux导入so文件
- 解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】
- Win10 无法用内置管理员帐户打开 解决方案
- linux 下 查看进程的启动时间和运行时间
- HDU 1009:FatMouse&;#39; Trade(简单贪心)
- web页面性能分析一些网址