Class<T>
类Class已经泛型化了,但是很多人一开始都感觉其泛型化的方式很混乱。Class<T>中类型参数T的含义是什么?事实证明它是所引用的类接口。怎么会是这样的呢?那是一个循环推理?如果不是的话,为什么这样定义它?
在以前的 JDK 中,Class.newInstance()方法的定义返回Object,您很可能要将该返回类型强制转换为另一种类型:
class Class {
Object newInstance();
} |
但是使用泛型,您定义Class.newInstance()方法具有一个更加特定的返回类型:
class Class<T> {
T 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 对象的一个集合。您通过反射来实例化和初始化创建的对象,但是这并不意味着类型安全必须完全被抛至脑后。考虑下面这个方法:
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); |
编译器将会根据FooRecord.class是Class<FooRecord>类型的这一事实,推断getRecords()的返回类型。您使用类常量来构造新的实例并提供编译器在类型检查中要用到的类型信息。
分享到:
相关推荐
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 ...