¿Puedo evitar la conversión explícita con "genéricos" o mejor "patrones de diseño"?

nimo23:

Tengo una interfaz

public interface Query {

}

y su aplicación:

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

y otra interfaz

public interface Queries{

protected void runQuery(Query q);
}

y su aplicación que hacen uso de ella:

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

}

}

Todas las obras, sin embargo, ¿cómo puedo evitar el elenco en runQuery(Query q)(Tal vez con runQuery(Query<T> q))?

Imagine un conjunto de diferentes implementación de Query( UserQuery, StoreQuery, BalanceQuery, etc. - con la solución anterior, tengo que hacer un reparto explict en cada reemplazo de métodos, que es un poco incómodo.

¿Hay algo mejor patrón de diseño para este tipo de casos de uso que el anterior?

Mureinik:

Se podría hacer Queriesuna interfaz genérica:

public interface Queries<Q extends Query> {

    protected void runQuery(Q q);
}

A continuación, UserQueriespuede utilizar un tipo específico Query:

public class UserQueries implements Queries<UserQuery> {

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=331683&siteId=1
Recomendado
Clasificación