首页 > 解决方案 > 如何使“通用方法声明”接受子类

问题描述

我有一个接口方法:

List<User> getUsers(Query query);

及其实施:

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

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

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

现在我创建一个 Query 的子类:

class UserQuery extens Query{..}

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

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

正如接口中定义的那样,getUsers() 只接受一个“查询”对象而不是它的子类。

如何使该方法更通用,以便它可以接受 Query-Objects 以及它的所有子类?

我试过这个,但在 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;
}

标签: javaoopgenericsdesign-patternscollections

解决方案


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

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

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


推荐阅读