【问题标题】:How to make "generic method declaration" to accept subclasses如何使“通用方法声明”接受子类
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 我可以在不使用泛型的情况下使用 getUsers(Query query)..但是,我必须 cast query 才能访问UserQuery-Properties..我没有看到其他解决方案..当我使用您的建议时,我还必须进行演员表(UserQuery q = (Query) query;)..
  • “你必须”是错误的。 OP不必。不过,他们可以
  • 好的..所以你的整个问题都是错误的。您可以将 SubQuery 传递给您的方法
  • @nimo23 不,你不需要投射。就像比阿特丽斯已经在你的问题下写的那样:你的问题在别的地方。检查她提到的错字。
  • @nimo23 哦,好吧,我没想到你在公然撒谎。你写了多次你不能通过UserQuery。您的整个问题与在接受父类型的方法中访问子类的属性无关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2013-11-09
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多