从头认识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# 接口的隐式与显示实现说明
以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,"显示接口实现"就是使 ...
随机推荐
- flask-assets使用介绍
作用:对css.js静态文件进行打包,打包成一个文件,然后去除文件里的换行.空行等进行压缩: 而且 Flask-Assets 还会使用特定的 HTTP Response Header, 让浏览器缓存这 ...
- Vue实例总结
一.登陆框的要点总结: 1.暂无数据就是要myData里没数据时候才出来:删除全部就是要有数据才出来.v-show的使用: 2.表格行就是需要循环数据,v-for.{{$index}}.{{item. ...
- PHP5实现foreach语言结构遍历一个类的实例
PHP5实现foreach语言结构遍历一个类 创建一个类集成Iterator接口,并实现Iterator里面的方法即可,下面见实例代码实现 <?php class Test implements ...
- new Thread(new ThreadStart(this.StartServer))
Thread .new thUdpServer thUdpServer = new Thread(new ThreadStart(this.StartServer))
- 经典算法——Jump Game(II)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- 网络编程——The C10K Problem(C10K = connection 10 kilo 问题)。k 表示 kilo,即 1000
The C10K problem翻译 (C10K = connection 10 kilo 问题).k 表示 kilo,即 1000 比如:kilometer(千米), kilogram(千克). 如 ...
- (转)java 打印自身代码——真实世界不存在自指
public class SelfPrint { public static void main(String args[]) { char s = 34; ...
- scrollTop()--返回或设置匹配元素的滚动条的垂直位置
scrollTop() 方法返回或设置匹配元素的滚动条的垂直位置. scroll top offset 指的是滚动条相对于其顶部的偏移. 如果该方法未设置参数,则返回以像素计的相对滚动条顶部的偏移. ...
- Idea Cannot import to svn: Cannot run program "svn"
svn 出此问题:意味着不可检出代码. 按此修改,重启IDEA即可检出svn代码.
- HTML5事件-自定义右键菜单
WEB领域中,为实现上下文菜单,开发人员面临的主要问题是如何确定应该显示这个上下文菜单(Windows 中,右键单击:Mac 中,Ctrl+单击), 以及如何屏蔽与该操作相关联的默认上下文菜单. 解决 ...