如何使“泛型方法声明”接受子类

时间:2019-04-07 10:41:56

标签: java generics design-patterns

我有一个接口方法:

List<User> getUsers(Query query);

及其实现:

List<User> getUsers(Query query){
..
return users;
}

我可以毫无问题地使用它:

Query q = new Query(..);
List<User> users = getUsers(q);

现在,我创建查询的子类:

class UserQuery extens Query{..}

并希望将此子类的实例传递到getUsers()方法中:

UserQuery uq = new UserQuery(..);
List<User> users = getUsers(uq); // does not work, as getUsers accepts only "Query"-objects

如接口中所定义,getUsers()仅接受“查询”对象,而不接受其子类。

如何使该方法更通用,以便它既可以接受查询对象又可以接受其所有子类?

我尝试过,但是在Java中是不可能的

接口:

// is not possible in java
List<User> getUsers(<E extends Query> query);

// also not possible in java
List<User> getUsers(Object<? extends MarketdataQuery> query);

实施:

// is not possible in java
List<User> getUsers(<E extends Query> query){
..
return users;
}

**

编辑:

**

仅当我传递“查询”对象时,它才起作用:

// This works: 
Query q = new UserQuery(..); 
List<User> users = getUsers(q);


// This does not work:
UserQuery uq = new UserQuery(..);
List<User> users = getUsers(uq);

要获取实际的查询对象,我必须使用强制转换,因此无法将UserQuery传递给方法。

List<User> getUsers(Query query){
    UserQuery uq = (UserQuery) query;
    return users;
}

1 个答案:

答案 0 :(得分:1)

您可以生成方法,而不仅仅是参数。这将完成工作:

<E extends Query> List<User> getUsers(E query);

现在query可以是Query类型或它的任何其他子类。