我可以避免使用“泛型”或更好的“设计模式”进行显式转换吗?

时间:2019-05-17 20:10:29

标签: java generics design-patterns

我有一个界面

public interface Query {

}

及其实现:

public class UserQuery implements Query {
// specific properties to query a user
}

和另一个界面

public interface Queries{

protected void runQuery(Query q);
}

及其实现方式:

public UserQueries extends Queries{

@Override
protected void runQuery(Query q){

// can I avoid this explicit cast with generic type parameters or other design patterns?
// for example Query<UserQuery> ?
var uq = (UserQuery) q;
..

}

}

所有方法都有效,但是如何避免在runQuery(Query q)中进行强制转换(也许使用runQuery(Query<T> q))?

想象一下QueryUserQueryStoreQueryBalanceQuery等的一组不同实现-对于上述解决方案,我必须在每个覆盖方法有点尴尬。

在上述用例中是否有更好的设计模式?

1 个答案:

答案 0 :(得分:5)

您可以将Queries设置为通用接口:

public interface Queries<Q extends Query> {

    protected void runQuery(Q q);
}

然后,UserQueries可以使用特定类型的Query

public class UserQueries implements Queries<UserQuery> {

    @Override
    protected void runQuery(UserQuery q) {
        // q is a UserQuery, no need to cast anything...
    }
}