Ярлык для параметризованного типа?
Я работаю с кодом, где мне нужно генерировать много List<Map<String,Object>>
и это неудобно, чтобы напечатать, например, bob = new List<Map<String,Object>>
все время.
Я пытался создать пустой класс а-ля
class ListMap extends List<Map<String,Object>> {}
но тогда методы, которые принимают List<Map<String,Object>>
не принимайте new ListMap()
как их тип, и я получаю ошибки от методов, которые возвращают List<Map<String,Object>>
если я назначу их ListMap
, По сути, я хочу, чтобы Java воспринимала мой ListMap так же, как List>... потому что это, по крайней мере, через наследование, в теории.
2 ответа
Так как у вас есть методы, возвращающие 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());
В таком случае лучший способ действий - это добавить методы конвертации к вашему ListMap
к и от List<Map<String, Object>>
... знаю, что вы могли бы реализовать ListMap
вдали, что зависит от изменений в оригинале List
если вы можете сохранить ссылку на это и реализовать ListMap
делегировать или хранить изменения отдельно, в этом случае вы можете сделать ListMap
расширяет любой из List
реализации в java.util.*
,
class ListMap extends AbstractList<Map<String, Object>> {
public ListMap(final Map<String, Object> list) { super(list); }
// or
public static ListMap fromList(final List<Map<String, Object>> list) {
if (list instanceof ListMap) {
return (ListMap) list;
} else {
return new ListMap(list);
}
}
}
Использование статического метода, описанного выше, позволит вам сохранить экземпляр, если получится, что список на самом деле ListMap
,