Java - 如何将Generic参数作为Class <t>传递给构造函数</t>

时间:2011-11-11 17:30:15

标签: java generics inheritance

我在这里有一个问题仍然无法解决,问题是我有这个抽象类:

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到所有后代的基本功能,所以我不必在所有后代中重复相同的代码。谢谢!

3 个答案:

答案 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];
}

因此根本不需要参数化构造函数。