[英]Can I avoid explicit cast with “generics” or better “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)
也许与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...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.