Просто столкнулся с местом, где я хотел бы использовать дженерики, и я не уверен, как заставить его проложить себе путь, я хочу.
У меня есть метод в моем слое данных, который делает запрос и возвращает список объектов. Вот подпись.
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
интерфейс. Я пытался использовать супер ключевое слово, но не мог понять это. Какие-либо гуру дженериков там знают, как это может быть сделано?
Вам нужно определить метод следующим образом:
public <B, C extends B> List<B> getList(final Class<C> cls, final Map<?, ?> query)
Единственный способ, о котором я могу думать, что это будет работать, это вот так:
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 (они несовместимы).
Есть ли какая-то причина, по которой вы не можете просто сделать это?
public List<T> getList<T>(Map query)