gpt4 book ai didi

java - 类 Cast Exception Generics Reflection ParameterizedType

转载 作者:行者123 更新时间:2023-11-30 05:52:32 48 4
gpt4 key购买 nike

我已经在 Stack 上寻找了一段时间的答案。所有的答案看起来都好像他们说我已经有了正确的答案,但我仍然在下面的构造函数的第一行收到类强制转换异常。

SEVERE: Exception while loading the app : EJB Container initialization error
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at com.domain.security.logging.ElsAbstractCrudClass.<init>(ElsAbstractCrudClass.java:54)

这是代码。查看文档后,我仍然无法弄清楚。我对泛型和反射比较陌生,所以需要一些帮助。 TIA。

    public abstract class ElsAbstractCrudClass<T> {
Class<T> entity;

public ElsAbstractCrudClass() {

[line 54] ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
Type type = genericSuperclass.getActualTypeArguments()[0];
this.entity = (Class<T>) type;

}
}

这里是抽象crud类的一个子类(SessionLog是一个JPA实体):

@Stateless
public class SessionLogger extends ElsAbstractCrudClass<SessionLog> {

@PersistenceContext(unitName = "ELS_Soulard_PU")
private EntityManager em;
@EJB
DozerInstantiator di;
//SessionLog entity;
//SessionLog sessionLog = new SessionLog();
static final Logger logger = Logger.getLogger(SessionLogger.class.getSimpleName());

public SessionLogger() {
}
...

最佳答案

getGenericSuperclass 如果父类(super class)是泛型则返回 ParameterizedType 的实例,否则返回 Class 的实例。大概你有这样的东西:

class A extends B { ... }
class B extends ElsAbstractCrudClass<Person> { ... }

现在,getClass() 返回带有父类(super class) B.classA.class,这不是通用的 ...

只要运行时类不是通用的(递归遍历类型层次结构,边走边用类型参数的定义替换类型参数),您就可以概括您的代码片段。然而,除非你有几十个 crud 类,否则要求子类传递正确的类对象会更容易:

public abstract class ElsAbstractCrudClass<T> {
final Class<T> entityClass;

public ElsAbstractCrudClass(Class<T> entityClass) {
this.entityClass = entityClass;
}
}

关于java - 类 Cast Exception Generics Reflection ParameterizedType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11586785/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com