一、 随着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 类型(boolean
、byte
、char
、short
、int
、long
、float
和 double
)和关键字 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); |
相关推荐
Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...
Notepad<String, Integer> t = new Notepad<>(); t.setKey("key"); t.setValue(10); System.out.println(t.getKey()); // 输出 "key" System.out.println(t.getValue()); // 输出 10 ``` #### 示例三:泛型方法 ``...
private LinkedList<E> elements = new LinkedList<>(); ``` **构造方法**: ```java public Stack() { // 初始化空栈 } ``` **入栈(push)方法**: ```java public void push(E element) { elements.addFirst...
4. **利用`Class<T>`作为泛型约束**:有时候,我们可以在泛型类中使用`Class<T>`作为参数或字段,这样可以在运行时获取类型信息。例如: ```java public class MyClass<T> { private final Class<T> clazz; ...
public abstract class BaseService<T, DAO extends BaseDao<T>> { protected DAO dao; public BaseService(DAO dao) { this.dao = dao; } public T findById(Long id) { return dao.findById(id); } // ...
Class<T> entityClass = (Class<T>) actualTypeArguments[0]; } ``` 在了解Java泛型的时候,需要熟悉它们的定义和使用,也要理解编译时擦除和运行时的表现。正确使用泛型可以提高代码的可读性和安全性,减少因类型...
* public class Gclass<T>{ private T a; public T getA() { return a; } public void setA(T a) { this.a = a; } } 泛型与继承: * 泛型中有继承的概念吗? * ArrayList<Integer> al2=new ArrayList<Integer>(); ...
Java泛型<T> T与T的使用方法详解 Java泛型是Java语言中的一种重要特性,它允许开发者在编写代码时可以指定类型,提高代码的灵活性和可读性。在Java中,泛型是通过类型擦除来实现的,即编译器在编译时擦除了所有泛型...
- 泛型类的实例化必须提供实际类型参数,如`MyList<String> list = new MyList<>();` - 对于无参构造的泛型类,可以使用匿名内部类的方式省略尖括号,如`new MyList<String>() {}`。 9. 泛型和静态方法: - 泛型...
"JAVA泛型笔记.pdf" Java 泛型(Generic)是 Java 5 中引入的一种机制,它允许开发者在编写类、接口和方法时指定类型参数,以提高代码的灵活性和可重用性。泛型的主要特点是可以在编译期检查类型的正确性,避免了...
Java泛型是Java编程语言中一个强大的特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。泛型的主要目标是提高代码的类型安全性和重用性,减少类型转换的麻烦,并在编译时捕获可能的类型错误。...
public class HibernateDaoImpl<T, PK extends Serializable> implements IHibernateDao<T, PK> { private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate ...
通过学习和掌握Java泛型,开发者能够编写出更健壮、类型安全的代码,减少类型转换错误,提升代码质量。这个视频教程"29-API-集合框架-泛型-使用"应该会深入浅出地讲解这些概念,对于想要提升Java编程技能的初学者或...
### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 ...
3. **类型推断**:在Java 7及以后的版本中,可以使用菱形操作符(`<>`)来进行类型推断,如`new DerivedClass<>();`,编译器会根据上下文自动推断类型参数。 4. **方法覆盖**:如果子类重写了父类的泛型方法,必须...
3. **替代方案**:在大多数情况下,使用 `List<T>` 而不是泛型数组更为可行,因为它提供了更多的灵活性并且避免了类型擦除带来的问题。 4. **谨慎使用泛型数组**:尽管在某些场景下可能需要用到泛型数组,但由于其...
泛型类是在类定义中使用尖括号`<>`来声明的,它允许我们创建可以处理多种数据类型的对象。例如,一个简单的泛型栈类可能如下所示: ```java public class GenericStack<T> { private T[] elements; private int ...