首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JAVA 范型 - Class<T>

2013-09-08 
JAVA 范型 - ClassT一、 随着Java的发展,类Class已经泛型化了。但是随之而来会有一系列的疑问,ClassT?中

JAVA 范型 - Class<T>

一、 随着Java的发展,类Class已经泛型化了。但是随之而来会有一系列的疑问,Class<T>?中类型参数?T?的含义是什么?Class<T>和Object有什么区别?

?

实际上,在之前的JDK版本中,Class.newInstance()?方法的定义返回?Object,您很可能要将该返回类型强制转换为另一种类型:

class Class {
? ? ?Object newInstance();
?}

?

但是使用泛型,您定义?Class.newInstance()?方法具有一个更加特定的返回类型:

?

class Class<T> {
? ? ?T newInstance();
}?

?

二、类型参数:

T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>

三、java中Class<T>的完整定义为:

public final class Class<T>extends Objectimplements Serializable, GenericDeclaration, Type, AnnotatedElement

?

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(booleanbytecharshortintlongfloatdouble)和关键字 void 也表示为 Class 对象。

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

以下示例使用 Class 对象来显示对象的类名:

?

     void printClassName(Object obj) {         System.out.println("The class of " + obj +                            " is " + obj.getClass().getName());     } 

还可以使用一个类字面值来获取指定类型(或 void)的 Class 对象。例如:

?

?

     System.out.println("The name of class Foo is: "+Foo.class.getName()); 

四、如何创建一个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);?

热点排行