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

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

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 隐式和显示的创建类型实例的更多相关文章

  1. C# interface 的隐式与显示实现及适应范围源码演示

    把代码过程中经常用到的一些代码段做个记录,如下的资料是关于C# interface 的隐式与显示实现及适应范围演示的代码. interface IAnimal { void Dog(); } clas ...

  2. 【java+selenium3】隐式等待+显式等待 (七)

    一.隐式等待 -- implicitlyWait 调用方式:driver.manage().timeouts().implicitlyWait(long time, TimeUnit unit); / ...

  3. C# 接口的隐式与显示实现

    隐式实现的话实现的方法属于实现的类的,可以直接通过类的对象访问,显式实现的话方法是属于接口的,可以看成是寄托在类中实现的,访问这些方法时要先把对象转换成接口对象,然后通过接口对象调用 一般来讲显式实现 ...

  4. C# 使用隐式或显示实现接口的区别

    通俗的来讲,"显示接口实现"就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:"隐式接口实现".费话不说,例子如下:      interface IA ...

  5. C# 接口的隐式与显示实现【转】

    以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习.通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的 ...

  6. C#的隐式和显示类型转换

    原文地址:http://blog.csdn.net/yysyangyangyangshan/article/details/7494577 关于隐式转换和显示转换,每种语言都有的,C#中当然也不例外. ...

  7. C#之隐式与显示类型转换

    今天在看一篇有关数据类型的文章的时候,无意间看到了两个关键词,"隐式转换"与"显示转换",然后突然想起了当初开始学编程的时候,也总是在代码编译的时候遇到这样的问 ...

  8. C# 接口的隐式与显示实现及适应场景

    通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:“隐式接口实现”.废话不说,例子如下: interface IAnimal { void Dog(); } cla ...

  9. C# 接口的隐式与显示实现说明

    以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,"显示接口实现"就是使 ...

随机推荐

  1. 80端口被system进程占用解决方法

    今天启动Apache的时候老是提示失败,很简单,使用 netstat -ano 发现80端口被占用.如图所示: 按照PID 来说:在任务管理器中查看PID 的进程名 既然是system.那么 应该不回 ...

  2. 判断浏览器是否支持 JS

    在有些浏览器中不支持(或者被禁用了)脚本语言,那么javascript脚本则无法被执行.但是用户并不知道浏览器是否支持,或者被禁用.我们可以通过<noscript>标签来告知用户,JS脚运 ...

  3. Python 自用代码(调整日期格式)

    2017年6月28日 to 2017-06-282017年10月27日 to 2017-10-272017年12月1日 to 2017-12-012017年7月1日 to 2017-07-01 #co ...

  4. Java Executor框架

    java.util.concurrent 包中包含灵活的线程池实现,但是更重要的是,它包含用于管理实现 Runnable 的任务的执行的整个框架,该框架称为 Executor 框架.该框架基于生产者- ...

  5. 使用Nginx+uWSGI+Django方法部署Django程序(上)

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...

  6. android logo设计

    应用程序图标 (Icon)应当是一个 Alpha 通道透明的32位 PNG 图片.由于安卓设备众多,一个应用程序图标需要设计几种不同大小,如: LDPI (Low Density Screen,120 ...

  7. 《windows核心编程》 18章 堆

    堆的优缺点: 优点:让我们专心解决手头问题,不必理会分配粒度和页边界这类事情. 缺点:分配和释放内存块的速度比其他方式慢,而且也无法对物理存储器的调拨和撤销进行直接控制. 什么是堆: 堆就是一块预订的 ...

  8. HttpClient Coder Example

    Example 1:   HttpClient httpClient = new HttpClient();                 httpClient.getHostConfigurati ...

  9. 【转】前端上传组件Plupload

    [转自博客园-无双] html5原生的给我们提供了文件上传的API,Plupload是一款由著名的web编辑器TinyMCE团队开发的上传组件,简单易用且功能强大,我们完全可以使用Plupload来代 ...

  10. IOS推送通知測试工具PushMeBaby

    下载了PushMeBaby在xcode5里中不能使用.类库变了.须要加入Carbon.framework库.在引用的地方改成: #include <Carbon/Carbon.h>.程序就 ...