`
Josh_Persistence
  • 浏览: 1653753 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

JAVA 泛型 - Class<T>

    博客分类:
  • Java
阅读更多

一、 随着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 Object implements 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); 
4
3
分享到:
评论

相关推荐

    Java泛型的用法及T.class的获取过程解析

    Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...

    全面总结Java泛型--实例

    Notepad&lt;String, Integer&gt; t = new Notepad&lt;&gt;(); t.setKey("key"); t.setValue(10); System.out.println(t.getKey()); // 输出 "key" System.out.println(t.getValue()); // 输出 10 ``` #### 示例三:泛型方法 ``...

    1.泛型类 、通配符的使用、通配符的上限和下限 编写泛型类Stack<E>,该类中定义一个成员变量和如下方法:

    private LinkedList&lt;E&gt; elements = new LinkedList&lt;&gt;(); ``` **构造方法**: ```java public Stack() { // 初始化空栈 } ``` **入栈(push)方法**: ```java public void push(E element) { elements.addFirst...

    java 泛型类的类型识别示例

    4. **利用`Class&lt;T&gt;`作为泛型约束**:有时候,我们可以在泛型类中使用`Class&lt;T&gt;`作为参数或字段,这样可以在运行时获取类型信息。例如: ```java public class MyClass&lt;T&gt; { private final Class&lt;T&gt; clazz; ...

    java泛型BaseDao与BaseService

    public abstract class BaseService&lt;T, DAO extends BaseDao&lt;T&gt;&gt; { protected DAO dao; public BaseService(DAO dao) { this.dao = dao; } public T findById(Long id) { return dao.findById(id); } // ...

    java泛型深入.pdf

    Class&lt;T&gt; entityClass = (Class&lt;T&gt;) actualTypeArguments[0]; } ``` 在了解Java泛型的时候,需要熟悉它们的定义和使用,也要理解编译时擦除和运行时的表现。正确使用泛型可以提高代码的可读性和安全性,减少因类型...

    java泛型学习ppt

    * public class Gclass&lt;T&gt;{ private T a; public T getA() { return a; } public void setA(T a) { this.a = a; } } 泛型与继承: * 泛型中有继承的概念吗? * ArrayList&lt;Integer&gt; al2=new ArrayList&lt;Integer&gt;(); ...

    Java泛型&lt;T&gt; T与T的使用方法详解

    Java泛型&lt;T&gt; T与T的使用方法详解 Java泛型是Java语言中的一种重要特性,它允许开发者在编写代码时可以指定类型,提高代码的灵活性和可读性。在Java中,泛型是通过类型擦除来实现的,即编译器在编译时擦除了所有泛型...

    关于java基础的泛型的练习

    - 泛型类的实例化必须提供实际类型参数,如`MyList&lt;String&gt; list = new MyList&lt;&gt;();` - 对于无参构造的泛型类,可以使用匿名内部类的方式省略尖括号,如`new MyList&lt;String&gt;() {}`。 9. 泛型和静态方法: - 泛型...

    JAVA泛型笔记.pdf

    "JAVA泛型笔记.pdf" Java 泛型(Generic)是 Java 5 中引入的一种机制,它允许开发者在编写类、接口和方法时指定类型参数,以提高代码的灵活性和可重用性。泛型的主要特点是可以在编译期检查类型的正确性,避免了...

    Java泛型_Java中的泛型结构_

    Java泛型是Java编程语言中一个强大的特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。泛型的主要目标是提高代码的类型安全性和重用性,减少类型转换的麻烦,并在编译时捕获可能的类型错误。...

    Spring/泛型Hibernate的实现

    public class HibernateDaoImpl&lt;T, PK extends Serializable&gt; implements IHibernateDao&lt;T, PK&gt; { private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate ...

    29-API-集合框架-泛型-使用_java_

    通过学习和掌握Java泛型,开发者能够编写出更健壮、类型安全的代码,减少类型转换错误,提升代码质量。这个视频教程"29-API-集合框架-泛型-使用"应该会深入浅出地讲解这些概念,对于想要提升Java编程技能的初学者或...

    java泛型指南 经典

    ### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 ...

    java 继承泛型类示例

    3. **类型推断**:在Java 7及以后的版本中,可以使用菱形操作符(`&lt;&gt;`)来进行类型推断,如`new DerivedClass&lt;&gt;();`,编译器会根据上下文自动推断类型参数。 4. **方法覆盖**:如果子类重写了父类的泛型方法,必须...

    java泛型数组

    3. **替代方案**:在大多数情况下,使用 `List&lt;T&gt;` 而不是泛型数组更为可行,因为它提供了更多的灵活性并且避免了类型擦除带来的问题。 4. **谨慎使用泛型数组**:尽管在某些场景下可能需要用到泛型数组,但由于其...

    Java泛型实例

    泛型类是在类定义中使用尖括号`&lt;&gt;`来声明的,它允许我们创建可以处理多种数据类型的对象。例如,一个简单的泛型栈类可能如下所示: ```java public class GenericStack&lt;T&gt; { private T[] elements; private int ...

Global site tag (gtag.js) - Google Analytics