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

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

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());
}
}

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

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

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

文件夹

最新文章

  1. 计算程序总行数的Python代码
  2. 模具厂MES项目介绍
  3. 编译系统中BNF: Backus-Naur Form
  4. 解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
  5. Oracle数据库中序列用法讲解
  6. MAC下搭建web开发环境
  7. Java Sleep() 与 Wait()的机制原理与区别
  8. 兼容PHP和Java的des加密解密代码分享
  9. Android上使用OpenGLES2.0显示YUV数据
  10. php编程提高执行效率技巧
  11. DOM范围
  12. 防止html5的video标签在iphone中自动全屏
  13. MySQL 8.0 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
  14. MapReduce编程:数字排序
  15. presto 函数中使用子查询
  16. JavaWeb基础-Jsp的请求与响应
  17. 在typeScript+vue项目中使用ref
  18. macOS下appstore提示未能完成该操作的解决办法
  19. 《Android高级进阶》读书笔记
  20. 源码的excel导入导出

热门文章

  1. Bitcoin 比特币, LTC(litecoin)莱特币,
  2. [Android UI] Service里面启动Activity和Alertdialog
  3. [原创]用逻辑嗅探破解接触式IC卡口令
  4. 纯C实现面向对象
  5. linux导入so文件
  6. 解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】
  7. Win10 无法用内置管理员帐户打开 解决方案
  8. linux 下 查看进程的启动时间和运行时间
  9. HDU 1009:FatMouse&amp;#39; Trade(简单贪心)
  10. web页面性能分析一些网址