检索泛型类型java以创建框架

时间:2018-01-03 02:47:56

标签: java c++ generics arguments

我想检索底层泛型类的参数,以便在其他类中使用它来创建所需的框架,例如我在C ++中会做这样的事情:

template <typename I> class Input {};
template <typename O> class Output{};
template <typename I, typename O> class Calculable : public Input<I>, Output<O>
{
    using inputType = I;
    using outputType = O;
};
template <typename S> class Example : public Calculable <typename S::inputType, typename S::outputType>{};

但我在Java中遇到了同样的问题。 Java中的Example类就像:

public class Example<T> extends Calculable<get T's inputType, get T's outputType>{}
What do I write here                            ^                   ^

由于我是java的新手,有人可以帮助我,答案很感激。

1 个答案:

答案 0 :(得分:-2)

正如@dsp_user所说:

  

Java并不支持多重继承,所以最接近的是尝试重写代码并生成输入和输出接口,并让Calculable实现这两个接口。

实现这些接口后,您可以使用getClass().getGenericSuperclass()获取类似于示例的泛型类参数。您可以将该方法的类型强制转换为ParameterizedType,然后使用方法getActualTypeArguments()获取实际类型。最后一个方法返回的数组将返回泛型类参数的实际类型的数组。

这是我的DAO课程可能对您有所帮助:

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public class GenericDaoImpl<E> implements GenericDao<E> {

    @PersistenceContext
    protected EntityManager em;

    private Class<E> entity;

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public GenericDaoImpl() {
        Type t = getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) t;
        entity = (Class) pt.getActualTypeArguments()[0];
    }

    @Override
    public E insert(final E e) {
        em.persist(e);
        return e;
    }

    @Override
    public E update(final E e) {
        return em.merge(e);
    }

    @Override
    public void deleteById(final Object id) {
        em.remove(em.getReference(entity, id));
        em.flush();
    }

    @Override
    public void delete(final E e) {
        em.remove(e);
        em.flush();
    }

    @Override
    public E findById(final Object id) {
        return em.find(entity, id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<E> findAll() {
        return em.createQuery("FROM " + entity.getName()).getResultList();
    }
}