从头认识java-13.9 隐式和显示的创建类型实例
对于上一章节擦除引起的问题与解决的方法有读者提出过于简单。这里解释一下:由于笔者本身也遇不到对应的问题。仅仅是凭空想像一些有可能的问题,基于水平有限,因此上一章节写的比較简单,欢迎广大读者踊跃提意见,我会尽量改进。
回归到这一章节,这里我们将讨论隐式和显示的创建类型实例。
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 隐式和显示的创建类型实例的更多相关文章
- C# interface 的隐式与显示实现及适应范围源码演示
把代码过程中经常用到的一些代码段做个记录,如下的资料是关于C# interface 的隐式与显示实现及适应范围演示的代码. interface IAnimal { void Dog(); } clas ...
- 【java+selenium3】隐式等待+显式等待 (七)
一.隐式等待 -- implicitlyWait 调用方式:driver.manage().timeouts().implicitlyWait(long time, TimeUnit unit); / ...
- C# 接口的隐式与显示实现
隐式实现的话实现的方法属于实现的类的,可以直接通过类的对象访问,显式实现的话方法是属于接口的,可以看成是寄托在类中实现的,访问这些方法时要先把对象转换成接口对象,然后通过接口对象调用 一般来讲显式实现 ...
- C# 使用隐式或显示实现接口的区别
通俗的来讲,"显示接口实现"就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:"隐式接口实现".费话不说,例子如下: interface IA ...
- C# 接口的隐式与显示实现【转】
以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习.通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的 ...
- C#的隐式和显示类型转换
原文地址:http://blog.csdn.net/yysyangyangyangshan/article/details/7494577 关于隐式转换和显示转换,每种语言都有的,C#中当然也不例外. ...
- C#之隐式与显示类型转换
今天在看一篇有关数据类型的文章的时候,无意间看到了两个关键词,"隐式转换"与"显示转换",然后突然想起了当初开始学编程的时候,也总是在代码编译的时候遇到这样的问 ...
- C# 接口的隐式与显示实现及适应场景
通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:“隐式接口实现”.废话不说,例子如下: interface IAnimal { void Dog(); } cla ...
- C# 接口的隐式与显示实现说明
以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,"显示接口实现"就是使 ...
随机推荐
- js时间小总结
1.js获取时间 var myDate = new Date(); 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份 ...
- 排查java.lang.OutOfMemoryError: GC overhead limit exceeded
帮助客户排查java.lang.OutOfMemoryError: GC overhead limit exceeded错误记录: 具体网址: https://support.oracle.com/e ...
- 本地DNS如何解析公网域名
DNS服务器图解: 为了服务于公司内部局域网应用,如域.本地网站.论坛.OA.ERP系统等,我们通常搭建本地DNS服务器. 将本地DNS服务器设置为首选DNS,本地系统解析访问是快了. 但内部DNS怎 ...
- centos7 iptables和firewalld学习记录
centos7系统使用firewalld服务替代了iptables服务,但是依然可以使用iptables来管理内核的netfilter 但其实iptables服务和firewalld服务都不是真正的防 ...
- GLSL使用FBO实现MRT(Multiple Render Targets)绘制到多张纹理 【转】
项目的程序里设计需要将某一帧渲染出来的画面拆成三通道单色图像存到三张纹理里面.要绘制到纹理里,自然就想到FBO了.但是一次要输出多张纹理,这个还没接触过.一阵网上搜索过后,终于了解到了MRT(多重渲染 ...
- unity 的视锥剔除和遮挡剔除
Regular frustum culling only renders objects within the camera’s view. This is automatic and always ...
- LOGO闪光效果
原地址:http://cl314413.blog.163.com/blog/static/1905079762014122105235138/ 这个效果在很多LOGO及广告宣传中都会用到.商业开发的做 ...
- 设计模式学习笔记--备忘录(Mamento)模式
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...
- 判断一个字符串是否为合法IP
输入任意一个字符串,判断是否为合法IP bool IsIPAddress(const char * str){ //先判断形式是否合法, //检查是否只包含点和数字 ; str[i] != '\0'; ...
- jquery遍历数组的方式
1,for循环: var arr = new Array(13.5,3,4,5,6); for(var i=0;i<arr.length;i++){ arr[i] = arr[i]/2.0; } ...