从子类设置超类中字段的类型(Java)

从子类设置超类中字段的类型(Java),java,design-patterns,inheritance,Java,Design Patterns,Inheritance,我正在Google App Engine上写一个项目,其中有许多抽象类,我希望我能在未来的项目中使用它们,还有一些继承自它们的具体类。 在其他抽象类中,我有一个进行用户管理的抽象servlet,我有一个抽象用户。AbstractUser拥有所有必要的字段和方法,用于将其存储在数据存储中,并告知用户是否已向我的服务注册。它不实现任何特定于项目的功能。管理用户的抽象servlet只引用AbstractUser类中声明的方法,该类允许它生成用于登录、注销和注册(针对未注册用户)的链接。 为了实现特定于

我正在Google App Engine上写一个项目,其中有许多抽象类,我希望我能在未来的项目中使用它们,还有一些继承自它们的具体类。 在其他抽象类中,我有一个进行用户管理的抽象servlet,我有一个抽象用户。AbstractUser拥有所有必要的字段和方法,用于将其存储在数据存储中,并告知用户是否已向我的服务注册。它不实现任何特定于项目的功能。管理用户的抽象servlet只引用AbstractUser类中声明的方法,该类允许它生成用于登录、注销和注册(针对未注册用户)的链接。 为了实现特定于项目的用户功能,我需要对抽象用户进行子类化。我在项目中使用的servlet都是抽象用户管理servlet的间接后代,用户是其中的受保护字段,因此后代servlet可以将其用作自己的字段。然而,每当我想要访问具体用户的任何特定于项目的方法时,我都需要将其转换为该类型。 i、 e

任何其他特定于项目的servlet:

int a = ((ConcreteUser) user).getA();
好吧,我想做的是以某种方式使超类中的“用户”类型依赖于特定于项目的抽象类中的某些内容。有可能吗

我不想把所有用户管理的东西都放到一个特定于项目的层中,因为我希望在我未来的项目中已经编写好:)


感谢您的帮助。

让您的
AbstractServlet
通用化:

public class AbstractServlet<T extends AbstractUser> { 
    private T user;
    protected abstract T getUser();
    ...
然后您将不再需要强制转换,因为您在基类中的任何位置
T
,您的实现现在将引用
ConcreteUser

public class ConcreteServlet extends AbstractServlet<ConcreteUser> { ...
@Override
protected abstract ConcreteUser getUser() { .. }

我认为您需要的是通用类:

class AbstractUserManager<UserType extends AbstractUser> {
    protected UserType user;    

    public UserType getUser() {
        return user;
    }

    public void addUser(UserType u) {
        this.user = u; 
    }

    ...some other methods that use AbstractUser and dont need specific functionality...
}

//Class used for managing AbstractUsers with no extra features
class SimpleUserManager extends AbstractUserManager<AbstractUser> {
//No body as AbstractUserManager is enough
}

//Class that manages CrazyUsers
class CrazyUserManager extends AbstractUserManager<CrazyUser> {
    public CrazyUserManager() {
        this.setUser(new CrazyUser());
    }

    public someNewFunction() {
        this.getUser().someCrazyActionOnlyCrazyUsersHave();
    }
}
类抽象用户管理器{
受保护的用户类型用户;
公共用户类型getUser(){
返回用户;
}
public void addUser(用户类型u){
这个用户=u;
}
…其他一些使用AbstractUser且不需要特定功能的方法。。。
}
//类,该类用于管理抽象用户,无需额外功能
类SimpleUserManager扩展了AbstractUserManager{
//作为AbstractUserManager的主体是不够的
}
//类来管理用户
类CrazyUserManager扩展了AbstractUserManager{
公共服务经理(){
this.setUser(new franchyuser());
}
公共函数{
this.getUser().someCrazyActionOnlyCrazyUsersHave();
}
}
class AbstractUserManager<UserType extends AbstractUser> {
    protected UserType user;    

    public UserType getUser() {
        return user;
    }

    public void addUser(UserType u) {
        this.user = u; 
    }

    ...some other methods that use AbstractUser and dont need specific functionality...
}

//Class used for managing AbstractUsers with no extra features
class SimpleUserManager extends AbstractUserManager<AbstractUser> {
//No body as AbstractUserManager is enough
}

//Class that manages CrazyUsers
class CrazyUserManager extends AbstractUserManager<CrazyUser> {
    public CrazyUserManager() {
        this.setUser(new CrazyUser());
    }

    public someNewFunction() {
        this.getUser().someCrazyActionOnlyCrazyUsersHave();
    }
}