JAVA 泛型 - Class<T>
来源:互联网 发布:js 作用域调用 this 编辑:程序博客网 时间:2024/06/05 18:41
Class<T>
类 Class 已经泛型化了,但是很多人一开始都感觉其泛型化的方式很混乱。Class<T> 中类型参数 T 的含义是什么?事实证明它是所引用的类接口。怎么会是这样的呢?那是一个循环推理?如果不是的话,为什么这样定义它?
在以前的 JDK 中,Class.newInstance() 方法的定义返回 Object,您很可能要将该返回类型强制转换为另一种类型:
class Class {Object newInstance();
}
但是使用泛型,您定义 Class.newInstance() 方法具有一个更加特定的返回类型:
class Class<T> {T newInstance();
}
如何创建一个 Class<T> 类型的实例?就像使用非泛型代码一样,有两种方式:调用方法 Class.forName() 或者使用类常量X.class。Class.forName() 被定义为返回 Class<?>。另一方面,类常量 X.class 被定义为具有类型 Class<X>,所以 String.class 是Class<String> 类型的。
让 Foo.class 是 Class<Foo> 类型的有什么好处?大的好处是,通过类型推理的魔力,可以提高使用反射的代码的类型安全。另外,还不需要将 Foo.class.newInstance() 强制类型转换为 Foo。
考虑一个方法,它从数据库检索一组对象,并返回 JavaBeans 对象的一个集合。您通过反射来实例化和初始化创建的对象,但是这并不意味着类型安全必须完全被抛至脑后。考虑下面这个方法:
public static<T> List<T> getRecords(Class<T> c, Selector s) {// Use Selector to select rows
List<T> list = new ArrayList<T>();
for (/* iterate over results */) {
T row = c.newInstance(); // use reflection to set fields from result
list.add(row);
}
return list;
}
可以像下面这样简单地调用该方法:
List<FooRecord> l = getRecords(FooRecord.class, fooSelector);编译器将会根据 FooRecord.class 是 Class<FooRecord> 类型的这一事实,推断 getRecords() 的返回类型。您使用类常量来构造新的实例并提供编译器在类型检查中要用到的类型信息。
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- java泛型T.class的获取
- java泛型T.class的获取
- java泛型T.class的获取
- Java 泛型(Class test<T>{...})
- java泛型T.class的获取
- java泛型T.class的获取
- java 泛型 class<T> 创建方法
- java泛型T.class的获取
- 伟大工程师从未说过的9句话
- Toolchain交叉编译器
- 网线连接错误导致的不能上网
- 监听button窗口鼠标mouse_over的消息
- “0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”
- JAVA 泛型 - Class<T>
- Linux下获取系统信息
- 一天小记
- Shell 返回值之 PIPESTATUS
- 网店系统SHOP++、V5shop、shopex全程分析比较
- Exception Exception in module wampmanager.exe at 000F15A0
- REST+SPRING+webservice交互xml数据
- GPIO配合移位寄存器控制LED
- OpenCV控制摄像头实现拍照