我有一个界面
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)
)?想象一下
Query
(UserQuery
,StoreQuery
,BalanceQuery
等)的一组不同实现-对于上述解决方案,我必须对每种覆盖方法都进行明确的表述,这有点尴尬。对于上述用例,是否有更好的设计模式?
最佳答案
您可以将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...
}
}