【发布时间】:2019-08-28 16:43:10
【问题描述】:
我有一个接口方法:
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;
}
【问题讨论】:
-
这个方法:List
getUsers(Query query);接受所有 Query 及其子类,因此它应该可以工作,但您的代码有其他问题。也许你在这里有一个编译错误:'class UserQuery extens Query{..}'
标签: java oop generics design-patterns collections