个人对泛型Class<T>的理解
来源:互联网 发布:虚拟光盘软件下载 编辑:程序博客网 时间:2024/05/16 23:37
类 Class 已经泛型化了,但是很多人一开始都感觉其泛型化的方式很混乱。Class 中类型参数 T 的含义是什么?事实证明它是所引用的类接口。怎么会是这样的呢?那是一个循环推理?如果不是的话,为什么这样定义它?
在以前的 JDK 中,Class.newInstance() 方法的定义返回 Object,您很可能要将该返回类型强制转换为另一种类型:
class Class {Object newInstance();
}
但是使用泛型,您定义 Class.newInstance() 方法具有一个更加特定的返回类型:
class Class {T newInstance();
}
如何创建一个 Class 类型的实例?就像使用非泛型代码一样,有两种方式:调用方法 Class.forName() 或者使用类常量X.class。Class.forName() 被定义为返回 Class。另一方面,类常量 X.class 被定义为具有类型 Class,所以 String.class 是Class 类型的。
让 Foo.class 是 Class 类型的有什么好处?大的好处是,通过类型推理的魔力,可以提高使用反射的代码的类型安全。另外,还不需要将 Foo.class.newInstance() 强制类型转换为 Foo。
考虑一个方法,它从数据库检索一组对象,并返回 JavaBeans 对象的一个集合。您通过反射来实例化和初始化创建的对象,但是这并不意味着类型安全必须完全被抛至脑后。考虑下面这个方法:
public static List getRecords(Class c, Selector s) {// Use Selector to select rows
List list = new ArrayList();
for (/* iterate over results */) {
T row = c.newInstance(); // use reflection to set fields from result
list.add(row);
}
return list;
}
可以像下面这样简单地调用该方法:
List l = getRecords(FooRecord.class, fooSelector);编译器将会根据 FooRecord.class 是 Class 类型的这一事实,推断 getRecords() 的返回类型。您使用类常量来构造新的实例并提供编译器在类型检查中要用到的类型信息。
复杂是复杂了,但是是对声明的人复杂,对于使用者,只有莫大的好处,类型安全、不用强制转换、语义明确等,一般使用JDK里面定义的泛型类就好,不需要自定义的话,谈不上什么复杂。
- 个人对泛型Class<T>的理解
- 对泛型<T>的一点理解
- T和Class<T>以及Class<?>的理解
- T和Class<T>以及Class<?>的理解
- T和Class<T>以及Class<?>的理解
- 个人对getInitParameter的理解
- 个人对宏观经济学的理解
- 个人对withValueBackReference的理解
- 个人对MVC的理解
- 对SVM的个人理解
- 个人对jms的理解
- 个人对aop的理解
- 个人对压缩的理解
- 个人对runtime的理解
- 对原型的个人理解
- 对 synchronized 的个人理解
- 对递归的个人理解
- 个人对贪心的理解
- pulltorefresh自动刷新
- Java报表FineReport在医院院长查询分析系统中有什么用
- 来京学习第二天
- Android中的蓝牙知识
- Write Tests for People
- 个人对泛型Class<T>的理解
- Block介绍(四)解开神秘面纱(下)
- static修饰符
- NSDictionary初始化的坑
- swift (一)
- IOS UITableView 使用总结
- Android 顶部灰条标题栏不显示的方法
- You Gotta Care About the Code
- 图的深度优先遍历 DFS