Как сделать "общее объявление метода", чтобы принимать подклассы - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть метод интерфейса:

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-объекты, но также и все его подклассы?

Я пробовал это, но в 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;
}

**

EDIT:

**

Работает только тогда, когда я передаю «Запрос» -Объект:

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


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

Чтобы получить настоящий Query-Object, мне нужно использовать приведение, поэтому я не могу передать UserQuery в метод ..

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

1 Ответ

1 голос
/ 07 апреля 2019

Вы можете генерировать метод, а не только параметр.Это сделает работу:

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

Теперь query может иметь тип Query или любой другой его подкласс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...