JAVA 泛型 - Class<T>
2014-02-11 10:12
295 查看
Class<T>
类 Class 已经泛型化了,但是很多人一开始都感觉其泛型化的方式很混乱。Class<T> 中类型参数 T 的含义是什么?事实证明它是所引用的类接口。怎么会是这样的呢?那是一个循环推理?如果不是的话,为什么这样定义它?
在以前的 JDK 中,Class.newInstance() 方法的定义返回 Object,您很可能要将该返回类型强制转换为另一种类型:
但是使用泛型,您定义 Class.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 对象的一个集合。您通过反射来实例化和初始化创建的对象,但是这并不意味着类型安全必须完全被抛至脑后。考虑下面这个方法:
可以像下面这样简单地调用该方法:
编译器将会根据 FooRecord.class 是 Class<FooRecord> 类型的这一事实,推断 getRecords() 的返回类型。您使用类常量来构造新的实例并提供编译器在类型检查中要用到的类型信息。
类 Class 已经泛型化了,但是很多人一开始都感觉其泛型化的方式很混乱。Class<T> 中类型参数 T 的含义是什么?事实证明它是所引用的类接口。怎么会是这样的呢?那是一个循环推理?如果不是的话,为什么这样定义它?
在以前的 JDK 中,Class.newInstance() 方法的定义返回 Object,您很可能要将该返回类型强制转换为另一种类型:
class Class { Object newInstance(); } |
class Class<T> { T newInstance(); } |
让 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); |
相关文章推荐
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface androi
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. <init>(Z)V
- java_web初学笔记之<泛型基础>
- <综合>java virtual machine launcher 提示 could not find the main class,program will exit 问题
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
- Java 基础一些代码练习笔记( GenericFoo<T> 泛型)
- 每天一读之 < Java 泛型与集合框架 >
- JNI中用 javah.exe 产生头JNI-Style文件出现错误:无法访问 <class> 未找到 <class> 的类文件
- java.lang 类 Class<T>
- [问题与解决] java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
- java中的<?><T><E>详解Jdk5.0新特性Generic Types (泛型)
- Java 泛型(Class test<T>{...})
- Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android
- JAVA 泛型BaseDao<T> BaseService <T>
- 7、利用泛型和反射,让public static <T> T findById(Class<T> clazz, int id)方法,更具一般性
- Java<>泛型方法
- Java中Class<T>与Class<?>之间有何区别