java - 如何使“通用方法声明”接受子类
问题描述
我有一个接口方法:
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;
}
解决方案
您可以生成方法,而不仅仅是参数。这将完成工作:
<E extends Query> List<User> getUsers(E query);
现在query
可以是类型Query
或它的任何其他子类。
推荐阅读
- c# - 使用 DllImport 将 C# byte[] 编组为 C++ DLL
- jquery - 使用值查看是否已执行操作
- php - password_verify 始终返回 false
- reactjs - Heroku 上的 Django-React 部署错误(MIME 类型错误)
- angular - webpack-dev-server 在 Webpack 4 中构建和重建速度非常慢
- javascript - 如何根据键和值比较对象数组并删除对象
- angular - 在Angular中插入新行时如何减少按钮文本之间的空间?
- mongodb - 为 mongoose 中的 containerId 数组查找 containerId 的最旧装运集合
- apache-flink - Flink KeyedProcessFunction vs 广播状态
- flutter - Flutter inAppWebview 从数据表导出下载文件