我想检索底层泛型类的参数,以便在其他类中使用它来创建所需的框架,例如我在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的新手,有人可以帮助我,答案很感激。
答案 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();
}
}