Поскольку у вас есть методы, возвращающие List<Map<String,Object>>
, но вы хотите присвоить их переменной типа ListMap
, а List<Map<String,Object>>
может быть реализован как ArrayList<Map<String,Object>>
, вы не можете сделать его напрямую совместимым с назначением сListMap
.
Итак, вам нужно обернуть возвращаемый объект делегирующим прокси.Сначала создайте общий делегирующий класс для List
.Их легко создать, например, Eclipse может создать для вас все методы делегирования, выбрав «Generate Delegate Methods...
» из выпадающего меню «Source
».
Это должно выглядеть так:
public class DelegatingList<E> implements List<E> {
private final List<E> list;
protected DelegatingList(List<E> list) {
this.list = list;
}
@Override
public int size() {
return this.list.size();
}
@Override
public boolean isEmpty() {
return this.list.isEmpty();
}
@Override
public boolean contains(Object o) {
return this.list.contains(o);
}
// many other delegating methods from List
}
Теперь определите ваш ListMap
интерфейс:
public interface ListMap extends List<Map<String,Object>> {
public static ListMap newArrayList() {
return wrap(new ArrayList<>());
}
public static ListMap wrap(List<Map<String,Object>> list) {
if (list instanceof ListMap)
return (ListMap) list;
class Wrapper extends DelegatingList<Map<String,Object>> implements ListMap {
protected Wrapper() {
super(list);
}
}
return new Wrapper();
}
}
Теперь его просто использовать:
ListMap myListMap = ListMap.newArrayList();
methodAcceptingListOfMapOfStringToObject(myListMap);
ListMap x = ListMap.wrap(methodReturningListOfMapOfStringToObject());