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

nim*_*o23 1 java generics design-patterns

我有一个界面

public interface Query {

}
Run Code Online (Sandbox Code Playgroud)

及其实现:

public class UserQuery implements Query {
// specific properties to query a user
}
Run Code Online (Sandbox Code Playgroud)

和另一个界面

public interface Queries{

protected void runQuery(Query q);
}
Run Code Online (Sandbox Code Playgroud)

以及利用它的实现:

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;
..

}
Run Code Online (Sandbox Code Playgroud)

}

所有作品,但是,如何避免强制转换runQuery(Query q)(可能带有runQuery(Query<T> q))?

想象一下,一组不同的实现的QueryUserQueryStoreQueryBalanceQuery,等等-与上面的解决方案,我不得不在这是一个有点尴尬每次重写方法的显式转换。

对于上述用例,是否有更好的设计模式?

Mur*_*nik 5

您可以创建Queries一个通用接口:

public interface Queries<Q extends Query> {

    protected void runQuery(Q q);
}
Run Code Online (Sandbox Code Playgroud)

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

public class UserQueries implements Queries<UserQuery> {

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