Вопрос о дженериках Java с подстановочными знаками

Просто столкнулся с местом, где я хотел бы использовать дженерики, и я не уверен, как заставить его проложить себе путь, я хочу.

У меня есть метод в моем слое данных, который делает запрос и возвращает список объектов. Вот подпись.

public List getList(Class cls, Map query)

Это - то, на что я хотел бы, чтобы код вызова был похож.

List<Whatever> list = getList(WhateverImpl.class, query);

Я хотел бы сделать его так, чтобы я не бросал это к a List<Whatever> выход, который приводит меня к этому.

public <T> List<T> getList(Class<T> cls, Map query)

Но теперь у меня есть проблема, которая, что я вынимаю, всегда бетон List<WhateverImpl> переданный в том, тогда как я хотел бы, чтобы это было Whatever интерфейс. Я пытался использовать супер ключевое слово, но не мог понять это. Какие-либо гуру дженериков там знают, как это может быть сделано?

5
задан Sean 9 June 2010 в 17:08
поделиться

3 ответа

Вам нужно определить метод следующим образом:

public <B, C extends B> List<B> getList(final Class<C> cls, final Map<?, ?> query)
8
ответ дан 14 December 2019 в 01:02
поделиться

Единственный способ, о котором я могу думать, что это будет работать, это вот так:

public <T extends Whatever> List<? extends Whatever> get(Class<T> clazz, Map query) {
 return new ArrayList<T>(); // do whatever it is you do here to return a List<T>
}

и затем вызвать его как:

List<? extends Whatever> l = get(WhateverImpl.class, query);
for (Whatever w : l) {
    // do something
}

Вы не можете вернуть List напрямую, поскольку вы не сможете привести List к нему внутри метода get (они несовместимы).

2
ответ дан 14 December 2019 в 01:02
поделиться

Есть ли какая-то причина, по которой вы не можете просто сделать это?

public List<T> getList<T>(Map query)
-1
ответ дан 14 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: