JAVA 泛型 - Class<T>
2012-10-19 09:30
357 查看
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() 的返回类型。您使用类常量来构造新的实例并提供编译器在类型检查中要用到的类型信息。
转自 http://blog.chinaunix.net/uid-1911213-id-3085866.html
类 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); |
转自 http://blog.chinaunix.net/uid-1911213-id-3085866.html
相关文章推荐
- Java 泛型(Class test<T>{...})
- java 泛型 class<T> 创建方法
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- Java中泛型T和Class<T>以及Class<?>的理解(转)
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- JAVA 泛型 - Class<T>
- Java中泛型的Class<Object>与Class<?>的区别(转)
- 泛型TEKV区别以及class<T>
- Java学习之道:简述泛型通配符<? extends T>和<? super T>
- Java中Class<T>与Class<?>的区别
- JNI DETECTED ERROR IN APPLICATION: can't call void XXX on instance of java.lang.Class <XXX>解决方案
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
- java.lang.NoSuchMethodException: <init> [class android.content.Context, interface androidutil.Attri
- class<T>和 class<?> 泛型区别
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. <init>(Z)V