通用代码段中ParameterizedType的含义

时间:2016-04-04 04:00:25

标签: java

对这个简单的问题表示歉意,但是我遇到了以下代码段(在另一个问题的答案中),但我真的不明白 ParameterizedType 这是什么.entity 行是什么意思?我猜它是在类型T上键入类,但我自己无法解释代码。

public class GenericDaoJpaImpl<T, PK extends Serializable> implements GenericDao<T, PK> {

    protected Class<T> entityClass;

    @PersistenceContext
    protected EntityManager entityManager;

    public GenericDaoJpaImpl() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
        this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
    }

1 个答案:

答案 0 :(得分:1)

getGenericSuperclass

  

返回表示此Class所代表的实体(类,接口,基本类型或void)的直接超类的Type。   如果超类是参数化类型,则返回的Type对象必须准确反映源代码中使用的实际类型参数。如果之前没有创建超类,则创建表示超类的参数化类型。有关参数化类型的创建过程的语义,请参阅ParameterizedType的声明。如果此Class表示Object类,接口,基本类型或void,则返回null。如果此对象表示数组类,则返回表示Object类的Class对象。

getGenericSuperclass方法返回Type对象,在本例中为ParameterizedType。 ParameterizedType是一个实际的Java类,是反射包的一部分。

  

ParameterizedType表示参数化类型,例如Collection。   参数化类型在反射方法第一次需要时创建,如此包中指定的那样。创建参数化类型p时,将解析p实例化的泛型类型声明,并递归创建p的所有类型参数。有关类型变量创建过程的详细信息,请参阅TypeVariable。重复创建参数化类型无效。

     

实现此接口的类的实例必须实现equals()方法,该方法等同于共享相同泛型类型声明且具有相同类型参数的任何两个实例。

然后调用ParameterizedType.getActualTypeArguments

  

返回一个Type对象数组,表示此类型的实际类型参数。   请注意,在某些情况下,返回的数组为空。如果此类型表示嵌套在参数化类型中的非参数化类型,则会发生这种情况。

因此,为了总结代码,GenericDaoJpaImpl方法获取自身的超类,然后从类中提取实际的类型信息,在这种情况下只提取第一个元素。如果查看类定义,您将看到它使用泛型类型'T'声明。因此,该方法正在提取正在用于此类实例的实际T类型。