我在这里有一个问题仍然无法解决,问题是我有这个抽象类:
public abstract class AbstractBean<T> {
private Class<T> entityClass;
public AbstractBean(Class<T> entityClass) {
this.entityClass = entityClass;
}
...
}
现在我有另一个继承这个摘要的类:
@Stateless
@LocalBean
public class BasicUserBean<T extends BasicUser> extends AbstractBean<T> {
private Class<T> user;
public BasicUserBean() {
super(user); // Error: cannot reference user before supertype contructor has been called.
}
}
我的问题是如何让它工作?我试图使类 BasicUserBean 可继承,所以如果我有继承的类 PersonBean BasicUserBean 然后我可以在Generic中设置实体 Person ,它也继承实体 BasicUser 。它最终会成为:
@Stateless
@LocalBean
public class PersonBean extends BasicUserBean<Person> {
public PersonBean() {
super(Person.class);
}
...
}
我只想继承BasicUserBean到所有后代的基本功能,所以我不必在所有后代中重复相同的代码。谢谢!
答案 0 :(得分:6)
您需要将构造函数添加到BasicUserBean
Class<T>
public BasicUserBean(Class<T> entityClass) {
super(entityClass);
}
您的无参数构造函数将无法工作,因为您要扩展的类需要T
。您不能在构造函数中有T
而不接受T
作为参数;无论如何,不是没有演员。
答案 1 :(得分:0)
如错误所述,您无法将实例字段传递给对超级构造函数的调用。请注意,在您调用user
时,字段null
始终为super
,这就是重点。您需要将user
传递给构造函数,并将其传递给super
或将user
设置为常量。
答案 2 :(得分:0)
如果AbstractUserBean是您自己的类,并且您可以更改它,则可以从
替换其构造函数public AbstractBean(Class<T> entityClass) {
this.entityClass = entityClass;
}
到这个
public AbstractBean() {
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<T>) type.getActualTypeArguments()[0];
}
因此根本不需要参数化构造函数。